/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact b74ebe5aca00ad5f831e19ae17193fe7b83a7ddf:


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: 35 2e 32 2e 31 20 32 30 30 35 2f 31 32 2f 31 39  5.2.1 2005/12/19
0360: 20 31 36 3a 32 39 3a 30 37 20 64 72 68 20 45 78   16:29:07 drh Ex
0370: 70 20 24 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  p $.*/.#ifndef S
0380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
0390: 4f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  O.#include "sqli
03a0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
03b0: 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 6c 75 64  e "os.h".#includ
03c0: 65 20 22 70 61 67 65 72 2e 68 22 0a 23 69 6e 63  e "pager.h".#inc
03d0: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
03e0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
03f0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f  .h>../*.** Macro
0400: 73 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  s for troublesho
0410: 6f 74 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79  oting.  Normally
0420: 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
0430: 69 66 20 30 0a 23 64 65 66 69 6e 65 20 54 52 41  if 0.#define TRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
0470: 32 28 58 2c 59 29 20 20 20 20 20 73 71 6c 69 74  2(X,Y)     sqlit
0480: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
0490: 59 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Y).#define TRACE
04a0: 33 28 58 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74  3(X,Y,Z)   sqlit
04b0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c  e3DebugPrintf(X,
04c0: 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Y,Z).#define TRA
04d0: 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c  CE4(X,Y,Z,W) sql
04e0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
04f0: 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65  X,Y,Z,W).#define
0500: 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c   TRACE5(X,Y,Z,W,
0510: 56 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  V) sqlite3DebugP
0520: 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57 2c 56 29  rintf(X,Y,Z,W,V)
0530: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
0540: 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e 65  RACE1(X).#define
0550: 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65   TRACE2(X,Y).#de
0560: 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c  fine TRACE3(X,Y,
0570: 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  Z).#define TRACE
0580: 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  4(X,Y,Z,W).#defi
0590: 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  ne TRACE5(X,Y,Z,
05a0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
05b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
05c0: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
05d0: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
05e0: 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f 73 20  TRACEX() macros 
05f0: 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e  above.** to prin
0600: 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73 63 72  t out file-descr
0610: 69 70 74 6f 72 73 2e 20 54 68 65 79 20 61 72 65  iptors. They are
0620: 20 72 65 71 75 69 72 65 64 20 73 6f 20 74 68 61   required so tha
0630: 74 20 74 72 61 63 69 6e 67 0a 2a 2a 20 63 61 6e  t tracing.** can
0640: 20 62 65 20 74 75 72 6e 65 64 20 6f 6e 20 77 68   be turned on wh
0650: 65 6e 20 75 73 69 6e 67 20 62 6f 74 68 20 74 68  en using both th
0660: 65 20 72 65 67 75 6c 61 72 20 6f 73 5f 75 6e 69  e regular os_uni
0670: 78 2e 63 20 61 6e 64 20 6f 73 5f 74 65 73 74 2e  x.c and os_test.
0680: 63 0a 2a 2a 20 62 61 63 6b 65 6e 64 73 2e 0a 2a  c.** backends..*
0690: 2a 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74  *.** PAGERID() t
06a0: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
06b0: 6f 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74  o a Pager struct
06c0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06d0: 74 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69  t. The.** associ
06e0: 61 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69  ated file-descri
06f0: 70 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  ptor is returned
0700: 2e 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29  . FILEHANDLEID()
0710: 20 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65   takes an OsFile
0720: 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74  .** struct as it
0730: 27 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  's argument..*/.
0740: 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 23  #ifdef OS_TEST.#
0750: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0760: 29 20 28 70 2d 3e 66 64 2d 3e 66 64 2e 68 29 0a  ) (p->fd->fd.h).
0770: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
0780: 4c 45 49 44 28 66 64 29 20 28 66 64 2d 3e 66 64  LEID(fd) (fd->fd
0790: 2e 68 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .h).#else.#defin
07a0: 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70 2d  e PAGERID(p) (p-
07b0: 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65 20 46  >fd.h).#define F
07c0: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 20  ILEHANDLEID(fd) 
07d0: 28 66 64 2e 68 29 0a 23 65 6e 64 69 66 0a 0a 2f  (fd.h).#endif../
07e0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61  *.** The page ca
07f0: 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65 20 69  che as a whole i
0800: 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e 65 20  s always in one 
0810: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0820: 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  .** states:.**.*
0830: 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  *   PAGER_UNLOCK
0840: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
0850: 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20 63 75   cache is not cu
0860: 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20  rrently reading 
0870: 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  or .**          
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69               wri
0890: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
08a0: 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65 20 69  e file.  There i
08b0: 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  s no.**         
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
08d0: 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72  ta held in memor
08e0: 79 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  y.  This is the 
08f0: 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20 20 20  initial.**      
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20   state..**.**   
0920: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
0930: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0940: 68 65 20 69 73 20 72 65 61 64 69 6e 67 20 74 68  he is reading th
0950: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 20 20 20 20 57 72 69 74 69 6e 67 20 69 73 20       Writing is 
0980: 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e 20 20  not permitted.  
0990: 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  There can be.** 
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65 20 72        multiple r
09c0: 65 61 64 65 72 73 20 61 63 63 65 73 73 69 6e 67  eaders accessing
09d0: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
09e0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
0a00: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
0a10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0a20: 5f 52 45 53 45 52 56 45 44 20 20 20 20 20 20 54  _RESERVED      T
0a30: 68 69 73 20 70 72 6f 63 65 73 73 20 68 61 73 20  his process has 
0a40: 72 65 73 65 72 76 65 64 20 74 68 65 20 64 61 74  reserved the dat
0a50: 61 62 61 73 65 20 66 6f 72 20 77 72 69 74 69 6e  abase for writin
0a60: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
0a70: 20 20 20 20 20 20 20 20 20 20 20 62 75 74 20 68             but h
0a80: 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  as not yet made 
0a90: 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20 4f 6e  any changes.  On
0aa0: 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73 0a 2a  ly one process.*
0ab0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0ac0: 20 20 20 20 20 20 20 20 61 74 20 61 20 74 69 6d          at a tim
0ad0: 65 20 63 61 6e 20 72 65 73 65 72 76 65 20 74 68  e can reserve th
0ae0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
0af0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b20: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 6d 6f   has not been mo
0b30: 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65 72 0a  dified so other.
0b40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b50: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0b60: 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  es may still be 
0b70: 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e 2d 64  reading the on-d
0b80: 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  isk.**          
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ba0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
0bb0: 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c 55 53  *   PAGER_EXCLUS
0bc0: 49 56 45 20 20 20 20 20 54 68 65 20 70 61 67 65  IVE     The page
0bd0: 20 63 61 63 68 65 20 69 73 20 77 72 69 74 69 6e   cache is writin
0be0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0bf0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c00: 20 20 20 20 20 20 20 20 20 41 63 63 65 73 73 20           Access 
0c10: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 4e  is exclusive.  N
0c20: 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
0c30: 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  s or.**         
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
0c50: 72 65 61 64 73 20 63 61 6e 20 62 65 20 72 65 61  reads can be rea
0c60: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
0c70: 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20 20 20  while one.**    
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 70 72 6f 63 65 73 73 20 69 73 20 77 72     process is wr
0ca0: 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50  iting..**.**   P
0cb0: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
0cc0: 20 20 20 54 68 65 20 70 61 67 65 72 20 6d 6f 76     The pager mov
0cd0: 65 73 20 74 6f 20 74 68 69 73 20 73 74 61 74 65  es to this state
0ce0: 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58 43 4c   from PAGER_EXCL
0cf0: 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20 20 20  USIVE.**        
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0d10: 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79 20 70  fter all dirty p
0d20: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
0d30: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a  ritten to the.**
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
0d70: 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  e has been synce
0d80: 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  d to.**         
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
0da0: 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72 65 6d  sk. All that rem
0db0: 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20 74 6f  ains to do is to
0dc0: 20 72 65 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 20   remove the.**  
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
0df0: 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  e and the transa
0e00: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a  ction will be.**
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64         committed
0e30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
0e40: 20 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20   cache comes up 
0e50: 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  in PAGER_UNLOCK.
0e60: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0e70: 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67   a.** sqlite3pag
0e80: 65 72 5f 67 65 74 28 29 20 6f 63 63 75 72 73 2c  er_get() occurs,
0e90: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0ea0: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0eb0: 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72  SHARED..** After
0ec0: 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
0ed0: 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73  been released us
0ee0: 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  ing sqlite_page_
0ef0: 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20  unref(),.** the 
0f00: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f10: 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
0f20: 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72  UNLOCK.  The fir
0f30: 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20  st time.** that 
0f40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
0f50: 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 20  te() is called, 
0f60: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0f70: 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45  tions to.** PAGE
0f80: 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e 6f  R_RESERVED.  (No
0f90: 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 5f 70  te that sqlite_p
0fa0: 61 67 65 5f 77 72 69 74 65 28 29 20 63 61 6e 20  age_write() can 
0fb0: 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65  only be.** calle
0fc0: 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64  d on an outstand
0fd0: 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20 6d  ing page which m
0fe0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
0ff0: 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69  ger must.** be i
1000: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 62  n PAGER_SHARED b
1010: 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69 74  efore it transit
1020: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52 45  ions to PAGER_RE
1030: 53 45 52 56 45 44 2e 29 0a 2a 2a 20 54 68 65 20  SERVED.).** The 
1040: 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41  transition to PA
1050: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f 63  GER_EXCLUSIVE oc
1060: 63 75 72 73 20 77 68 65 6e 20 62 65 66 6f 72 65  curs when before
1070: 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20   any changes.** 
1080: 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
1090: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
10a0: 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74 65 33  After an sqlite3
10b0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
10c0: 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 5f 70 61  .** or sqlite_pa
10d0: 67 65 72 5f 63 6f 6d 6d 69 74 28 29 2c 20 74 68  ger_commit(), th
10e0: 65 20 73 74 61 74 65 20 67 6f 65 73 20 62 61 63  e state goes bac
10f0: 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
1100: 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  D..*/.#define PA
1110: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
1120: 30 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  0.#define PAGER_
1130: 53 48 41 52 45 44 20 20 20 20 20 20 31 20 20 20  SHARED      1   
1140: 2f 2a 20 73 61 6d 65 20 61 73 20 53 48 41 52 45  /* same as SHARE
1150: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
1160: 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e PAGER_RESERVED
1170: 20 20 20 20 32 20 20 20 2f 2a 20 73 61 6d 65 20      2   /* same 
1180: 61 73 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  as RESERVED_LOCK
1190: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
11a0: 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 34 20  R_EXCLUSIVE   4 
11b0: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 45 58 43    /* same as EXC
11c0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23  LUSIVE_LOCK */.#
11d0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 59 4e  define PAGER_SYN
11e0: 43 45 44 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a  CED      5../*.*
11f0: 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
1200: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1210: 43 4b 20 6d 61 63 72 6f 20 69 73 20 73 65 74 20  CK macro is set 
1220: 74 6f 20 74 72 75 65 20 61 74 20 63 6f 6d 70 69  to true at compi
1230: 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e  le-time,.** then
1240: 20 66 61 69 6c 65 64 20 61 74 74 65 6d 70 74 73   failed attempts
1250: 20 74 6f 20 67 65 74 20 61 20 72 65 73 65 72 76   to get a reserv
1260: 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20 69 6e 76  ed lock will inv
1270: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
1280: 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 69  lback..** This i
1290: 73 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  s off by default
12a0: 2e 20 20 54 6f 20 73 65 65 20 77 68 79 2c 20 63  .  To see why, c
12b0: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
12c0: 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a 0a  owing scenario:.
12d0: 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  ** .** Suppose t
12e0: 68 72 65 61 64 20 41 20 61 6c 72 65 61 64 79 20  hread A already 
12f0: 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f 63  has a shared loc
1300: 6b 20 61 6e 64 20 77 61 6e 74 73 20 61 20 72 65  k and wants a re
1310: 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20  served lock..** 
1320: 54 68 72 65 61 64 20 42 20 61 6c 72 65 61 64 79  Thread B already
1330: 20 68 61 73 20 61 20 72 65 73 65 72 76 65 64 20   has a reserved 
1340: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1350: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1360: 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68 20 74 68  .  If.** both th
1370: 72 65 61 64 73 20 61 72 65 20 75 73 69 6e 67 20  reads are using 
1380: 74 68 65 69 72 20 62 75 73 79 20 63 61 6c 6c 62  their busy callb
1390: 61 63 6b 73 2c 20 69 74 20 6d 69 67 68 74 20 62  acks, it might b
13a0: 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a  e a long time.**
13b0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
13c0: 68 65 20 74 68 72 65 61 64 73 20 67 69 76 65 20  he threads give 
13d0: 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73 20 74 68  up and allows th
13e0: 65 20 6f 74 68 65 72 20 74 6f 20 70 72 6f 63 65  e other to proce
13f0: 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  ed..** But if th
1400: 65 20 74 68 72 65 61 64 20 74 72 79 69 6e 67 20  e thread trying 
1410: 74 6f 20 67 65 74 20 74 68 65 20 72 65 73 65 72  to get the reser
1420: 76 65 64 20 6c 6f 63 6b 20 67 69 76 65 73 20 75  ved lock gives u
1430: 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 28 69 66  p quickly.** (if
1440: 20 69 74 20 6e 65 76 65 72 20 69 6e 76 6f 6b 65   it never invoke
1450: 73 20 69 74 73 20 62 75 73 79 20 63 61 6c 6c 62  s its busy callb
1460: 61 63 6b 29 20 74 68 65 6e 20 74 68 65 20 63 6f  ack) then the co
1470: 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c 20 62 65  ntention will be
1480: 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20 71 75 69  .** resolved qui
1490: 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ckly..*/.#ifndef
14a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
14b0: 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20 64 65 66  ERVED_LOCK.# def
14c0: 69 6e 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ine SQLITE_BUSY_
14d0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 30 0a  RESERVED_LOCK 0.
14e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
14f0: 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e 64 73 20  is macro rounds 
1500: 76 61 6c 75 65 73 20 75 70 20 73 6f 20 74 68 61  values up so tha
1510: 74 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  t if the value i
1520: 73 20 61 6e 20 61 64 64 72 65 73 73 20 69 74 0a  s an address it.
1530: 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
1540: 20 74 6f 20 62 65 20 61 6e 20 61 64 64 72 65 73   to be an addres
1550: 73 20 74 68 61 74 20 69 73 20 61 6c 69 67 6e 65  s that is aligne
1560: 64 20 74 6f 20 61 6e 20 38 2d 62 79 74 65 20 62  d to an 8-byte b
1570: 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23 64 65 66  oundary..*/.#def
1580: 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  ine FORCE_ALIGNM
1590: 45 4e 54 28 58 29 20 20 20 28 28 28 58 29 2b 37  ENT(X)   (((X)+7
15a0: 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  )&~7)../*.** Eac
15b0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6d 61 67  h in-memory imag
15c0: 65 20 6f 66 20 61 20 70 61 67 65 20 62 65 67 69  e of a page begi
15d0: 6e 73 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ns with the foll
15e0: 6f 77 69 6e 67 20 68 65 61 64 65 72 2e 0a 2a 2a  owing header..**
15f0: 20 54 68 69 73 20 68 65 61 64 65 72 20 69 73 20   This header is 
1600: 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20 74 6f 20  only visible to 
1610: 74 68 69 73 20 70 61 67 65 72 20 6d 6f 64 75 6c  this pager modul
1620: 65 2e 20 20 54 68 65 20 63 6c 69 65 6e 74 0a 2a  e.  The client.*
1630: 2a 20 63 6f 64 65 20 74 68 61 74 20 63 61 6c 6c  * code that call
1640: 73 20 70 61 67 65 72 20 73 65 65 73 20 6f 6e 6c  s pager sees onl
1650: 79 20 74 68 65 20 64 61 74 61 20 74 68 61 74 20  y the data that 
1660: 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68 65 61 64  follows the head
1670: 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74  er..**.** Client
1680: 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 63 61 6c   code should cal
1690: 6c 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  l sqlite3pager_w
16a0: 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61 67 65  rite() on a page
16b0: 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69 6e 67   prior to making
16c0: 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69 63 61  .** any modifica
16d0: 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20 70 61  tions to that pa
16e0: 67 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  ge.  The first t
16f0: 69 6d 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  ime sqlite3pager
1700: 5f 77 72 69 74 65 28 29 0a 2a 2a 20 69 73 20 63  _write().** is c
1710: 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67 69  alled, the origi
1720: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
1730: 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
1740: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a  to the rollback.
1750: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  ** journal and P
1760: 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61  gHdr.inJournal a
1770: 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  nd PgHdr.needSyn
1780: 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74 65  c are set.  Late
1790: 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 6a  r, once.** the j
17a0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73 20  ournal page has 
17b0: 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68 65  made it onto the
17c0: 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20 50   disk surface, P
17d0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a  gHdr.needSync.**
17e0: 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54 68   is cleared.  Th
17f0: 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20  e modified page 
1800: 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74 65  cannot be writte
1810: 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
1820: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61  original.** data
1830: 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
1840: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1850: 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65  s has been synce
1860: 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74 68  d to disk and th
1870: 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64 53  e.** PgHdr.needS
1880: 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c 65  ync has been cle
1890: 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ared..**.** The 
18a0: 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61 67  PgHdr.dirty flag
18b0: 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71 6c   is set when sql
18c0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
18d0: 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a  ) is called and.
18e0: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67  ** is cleared ag
18f0: 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67  ain when the pag
1900: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69  e content is wri
1910: 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
1920: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
1930: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74  abase file..*/.t
1940: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1950: 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63  Hdr PgHdr;.struc
1960: 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65  t PgHdr {.  Page
1970: 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1990: 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68  e pager to which
19a0: 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e   this page belon
19b0: 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
19c0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
19d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
19e0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
19f0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1a00: 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a  dr *pNextHash, *
1a10: 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48  pPrevHash;  /* H
1a20: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
1a30: 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67  ain for PgHdr.pg
1a40: 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  no */.  PgHdr *p
1a50: 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76  NextFree, *pPrev
1a60: 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69  Free;  /* Freeli
1a70: 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72  st of pages wher
1a80: 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50  e nRef==0 */.  P
1a90: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab0: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
1ac0: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1ad0: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
1ae0: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
1af0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1b00: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1b10: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75  al */.  u8 inJou
1b20: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
1b30: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1b40: 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  f has been writt
1b50: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
1b60: 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20  .  u8 inStmt;   
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20    /* TRUE if in 
1b90: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1ba0: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38  bjournal */.  u8
1bb0: 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20   dirty;         
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd0: 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20  TRUE if we need 
1be0: 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68  to write back ch
1bf0: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65  anges */.  u8 ne
1c00: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
1c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e            /* Syn
1c20: 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  c journal before
1c30: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61   writing this pa
1c40: 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ge */.  u8 alway
1c50: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
1c60: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
1c70: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1c80: 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  ) for this page 
1c90: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1ca0: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1cb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1cc0: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1cd0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1ce0: 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20  pDirty;         
1cf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 74 79          /* Dirty
1d00: 20 70 61 67 65 73 20 73 6f 72 74 65 64 20 62 79   pages sorted by
1d10: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23   PgHdr.pgno */.#
1d20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1d30: 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70  CK_PAGES.  u32 p
1d40: 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a  ageHash;.#endif.
1d50: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67    /* pPager->pag
1d60: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70  eSize bytes of p
1d70: 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  age data follow 
1d80: 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20  this header */. 
1d90: 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61   /* Pager.nExtra
1da0: 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20   bytes of local 
1db0: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20  data follow the 
1dc0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a  page data */.};.
1dd0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e  ./*.** For an in
1de0: 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74  -memory only dat
1df0: 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72  abase, some extr
1e00: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  a information is
1e10: 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a   recorded about.
1e20: 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20  ** each page so 
1e30: 74 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e  that changes can
1e40: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
1e50: 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73    (Journal files
1e60: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64   are not.** used
1e70: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1e80: 61 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20  atabases.)  The 
1e90: 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d  following inform
1ea0: 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ation is added t
1eb0: 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20  o.** the end of 
1ec0: 65 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63  every EXTRA bloc
1ed0: 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20  k for in-memory 
1ee0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
1ef0: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
1f00: 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  n could have bee
1f10: 6e 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79  n added directly
1f20: 20 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74   to the PgHdr st
1f30: 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20  ructure..** But 
1f40: 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61  then it would ta
1f50: 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38  ke up an extra 8
1f60: 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67   bytes of storag
1f70: 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72  e on every PgHdr
1f80: 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73  .** even for dis
1f90: 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  k-based database
1fa0: 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74  s.  Splitting it
1fb0: 20 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74   out saves 8 byt
1fc0: 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  es.  This.** is 
1fd0: 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f  only a savings o
1fe0: 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65  f 0.8% but those
1ff0: 20 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64   percentages add
2000: 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20   up..*/.typedef 
2010: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
2020: 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75   PgHistory;.stru
2030: 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20  ct PgHistory {. 
2040: 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20   u8 *pOrig;     
2050: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65  /* Original page
2060: 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20   text.  Restore 
2070: 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c  to this on a ful
2080: 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  l rollback */.  
2090: 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f  u8 *pStmt;     /
20a0: 2a 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73  * Text as it was
20b0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
20c0: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
20d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b   statement */.};
20e0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
20f0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
2100: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
2110: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
2120: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2130: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2140: 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29 20 69  CODEC(P,D,N,X) i
2150: 66 28 20 50 2d 3e 78 43 6f 64 65 63 20 29 7b 20  f( P->xCodec ){ 
2160: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
2170: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
2180: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
2190: 43 4f 44 45 43 28 50 2c 44 2c 4e 2c 58 29 0a 23  CODEC(P,D,N,X).#
21a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  endif../*.** Con
21b0: 76 65 72 74 20 61 20 70 6f 69 6e 74 65 72 20 74  vert a pointer t
21c0: 6f 20 61 20 50 67 48 64 72 20 69 6e 74 6f 20 61  o a PgHdr into a
21d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 73 20   pointer to its 
21e0: 64 61 74 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b  data.** and back
21f0: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69   again..*/.#defi
2200: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ne PGHDR_TO_DATA
2210: 28 50 29 20 20 28 28 76 6f 69 64 2a 29 28 26 28  (P)  ((void*)(&(
2220: 50 29 5b 31 5d 29 29 0a 23 64 65 66 69 6e 65 20  P)[1])).#define 
2230: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 44 29  DATA_TO_PGHDR(D)
2240: 20 20 28 26 28 28 50 67 48 64 72 2a 29 28 44 29    (&((PgHdr*)(D)
2250: 29 5b 2d 31 5d 29 0a 23 64 65 66 69 6e 65 20 50  )[-1]).#define P
2260: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 47 2c  GHDR_TO_EXTRA(G,
2270: 50 29 20 28 28 76 6f 69 64 2a 29 26 28 28 63 68  P) ((void*)&((ch
2280: 61 72 2a 29 28 26 28 47 29 5b 31 5d 29 29 5b 28  ar*)(&(G)[1]))[(
2290: 50 29 2d 3e 70 61 67 65 53 69 7a 65 5d 29 0a 23  P)->pageSize]).#
22a0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
22b0: 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a 20  HIST(P,PGR)  \. 
22c0: 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67 48             ((PgH
22d0: 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72 2a  istory*)&((char*
22e0: 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47 52  )(&(P)[1]))[(PGR
22f0: 29 2d 3e 70 61 67 65 53 69 7a 65 2b 28 50 47 52  )->pageSize+(PGR
2300: 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a  )->nExtra])../*.
2310: 2a 2a 20 48 6f 77 20 62 69 67 20 74 6f 20 6d 61  ** How big to ma
2320: 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
2330: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 61 74  e used for locat
2340: 69 6e 67 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  ing in-memory pa
2350: 67 65 73 0a 2a 2a 20 62 79 20 70 61 67 65 20 6e  ges.** by page n
2360: 75 6d 62 65 72 2e 20 54 68 69 73 20 6d 61 63 72  umber. This macr
2370: 6f 20 6c 6f 6f 6b 73 20 61 20 6c 69 74 74 6c 65  o looks a little
2380: 20 73 69 6c 6c 79 2c 20 62 75 74 20 69 73 20 65   silly, but is e
2390: 76 61 6c 75 61 74 65 64 0a 2a 2a 20 61 74 20 63  valuated.** at c
23a0: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74  ompile-time, not
23b0: 20 72 75 6e 2d 74 69 6d 65 20 28 61 74 20 6c 65   run-time (at le
23c0: 61 73 74 20 66 6f 72 20 67 63 63 20 74 68 69 73  ast for gcc this
23d0: 20 69 73 20 74 72 75 65 29 2e 0a 2a 2f 0a 23 64   is true)..*/.#d
23e0: 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53 48 20  efine N_PG_HASH 
23f0: 28 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e  (\.  (MAX_PAGES>
2400: 31 30 32 34 29 3f 32 30 34 38 3a 20 5c 0a 20 20  1024)?2048: \.  
2410: 28 4d 41 58 5f 50 41 47 45 53 3e 35 31 32 29 3f  (MAX_PAGES>512)?
2420: 31 30 32 34 3a 20 5c 0a 20 20 28 4d 41 58 5f 50  1024: \.  (MAX_P
2430: 41 47 45 53 3e 32 35 36 29 3f 35 31 32 3a 20 5c  AGES>256)?512: \
2440: 0a 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 32  .  (MAX_PAGES>12
2450: 38 29 3f 32 35 36 3a 20 5c 0a 20 20 28 4d 41 58  8)?256: \.  (MAX
2460: 5f 50 41 47 45 53 3e 36 34 29 3f 31 32 38 3a 36  _PAGES>64)?128:6
2470: 34 20 5c 0a 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73  4 \.)../*.** Has
2480: 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  h a page number.
2490: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  */.#define pager
24a0: 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e 29  _hash(PN)  ((PN)
24b0: 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29 0a  &(N_PG_HASH-1)).
24c0: 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61  ./*.** A open pa
24d0: 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20 69  ge cache is an i
24e0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
24f0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2500: 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  re..*/.struct Pa
2510: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
2520: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
2530: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
2540: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
2550: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
2560: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2570: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2590: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
25a0: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
25b0: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
25c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
25e0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
25f0: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2600: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2610: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
2620: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
2630: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
2640: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
2650: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2660: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
2670: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2680: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2690: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
26a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
26b0: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
26c0: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
26d0: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
26e0: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
26f0: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2700: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2710: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
2720: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
2730: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2740: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
2750: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
2760: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
2770: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2780: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2790: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
27a0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
27b0: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
27c0: 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  state;          
27d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
27e0: 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45  R_UNLOCK, _SHARE
27f0: 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74  D, _RESERVED, et
2800: 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61  c. */.  u8 errMa
2810: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
2820: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65      /* One of se
2830: 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65  veral kinds of e
2840: 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65  rrors */.  u8 te
2850: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
2860: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
2870: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2880: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2890: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
28a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
28b0: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
28c0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
28d0: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
28e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
28f0: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2900: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2910: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2920: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2940: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2950: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2960: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2970: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2980: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
2990: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
29a0: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  all pages */.  u
29b0: 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20  8 memDb;        
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29d0: 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c  ue to inhibit al
29e0: 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20  l file I/O */.  
29f0: 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20  u8 setMaster;   
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2a10: 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d  rue if a m-j nam
2a20: 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  e has been writt
2a30: 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20  en to jrnl */.  
2a40: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a60: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2a70: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2a80: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
2aa0: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
2ab0: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
2ac0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
2ad0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ae0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2af0: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2b00: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2b10: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2b40: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ges written to t
2b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2b60: 75 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20  u32 cksumInit;  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51              /* Q
2b80: 75 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75  uasi-random valu
2b90: 65 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79  e added to every
2ba0: 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69   checksum */.  i
2bb0: 6e 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20  nt stmtNRec;    
2bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2bd0: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
2be0: 69 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e  in stmt subjourn
2bf0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  al */.  int nExt
2c00: 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ra;             
2c10: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20      /* Add this 
2c20: 6d 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61  many bytes to ea
2c30: 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
2c40: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  e */.  int pageS
2c50: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2c60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c70: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2c80: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2cb0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
2cc0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  ges */.  int nMa
2cd0: 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  xPage;          
2ce0: 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74       /* High wat
2cf0: 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65  er mark of nPage
2d00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2d30: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2d40: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2d50: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d70: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2d80: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
2d90: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
2da0: 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61  .  u8 *aInJourna
2db0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2dc0: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
2dd0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
2de0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2df0: 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20    u8 *aInStmt;  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e10: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e20: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2e30: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
2e40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
2e50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e70: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2e80: 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  zJournal;       
2e90: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ea0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2eb0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69  e */.  char *zDi
2ec0: 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20  rectory;        
2ed0: 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20     /* Directory 
2ee0: 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e  hold database an
2ef0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
2f00: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64 2c 20  */.  OsFile fd, 
2f10: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  jfd;            
2f20: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2f30: 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73  tors for databas
2f40: 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f  e and journal */
2f50: 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64 3b 20  .  OsFile stfd; 
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f70: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2f80: 72 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d  r for the statem
2f90: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f  ent subjournal*/
2fa0: 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  .  BusyHandler *
2fb0: 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f  pBusyHandler;  /
2fc0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2fd0: 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20  ite.busyHandler 
2fe0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
2ff0: 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20  st, *pLast;     
3000: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
3010: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3020: 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r *pFirstSynced;
3030: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
3040: 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20   free page with 
3050: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d  PgHdr.needSync==
3060: 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41  0 */.  PgHdr *pA
3070: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
3080: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c     /* List of al
3090: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  l pages */.  PgH
30a0: 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  dr *pStmt;      
30b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
30c0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
30d0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
30e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
30f0: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
3100: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
3110: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e  t byte offset in
3120: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
3130: 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  e */.  i64 journ
3140: 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  alHdr;          
3150: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
3160: 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f  t to previous jo
3170: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a  urnal header */.
3180: 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66    i64 stmtHdrOff
3190: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31a0: 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   First journal h
31b0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74 68  eader written th
31c0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
31d0: 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b    i64 stmtCksum;
31e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f0: 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20   cksumInit when 
3200: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
3210: 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73  arted */.  i64 s
3220: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
3230: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
3240: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d  f journal at stm
3250: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
3260: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
3270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
3280: 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a  sumed sector siz
3290: 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  e during rollbac
32a0: 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  k */.#ifdef SQLI
32b0: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
32c0: 69 74 2c 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c  it, nMiss, nOvfl
32d0: 3b 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68  ;     /* Cache h
32e0: 69 74 73 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e  its, missing, an
32f0: 64 20 4c 52 55 20 6f 76 65 72 66 6c 6f 77 73 20  d LRU overflows 
3300: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e  */.  int nRead,n
3310: 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
3320: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
3330: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
3340: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
3350: 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28   (*xDestructor)(
3360: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43  void*,int); /* C
3370: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
3380: 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61   when freeing pa
3390: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
33a0: 78 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a  xReiniter)(void*
33b0: 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c  ,int);   /* Call
33c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
33d0: 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67  en reloading pag
33e0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
33f0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
3400: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
3410: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
3420: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
3430: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
3440: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3450: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3460: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3470: 20 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e    PgHdr *aHash[N
3480: 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a  _PG_HASH];    /*
3490: 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d   Hash table to m
34a0: 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ap page number t
34b0: 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f  o PgHdr */.};../
34c0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 54  *.** If SQLITE_T
34d0: 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20 74  EST is defined t
34e0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
34f0: 65 20 76 61 72 69 61 62 6c 65 20 67 69 76 65 6e  e variable given
3500: 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   in.** the argum
3510: 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ent.*/.#ifdef SQ
3520: 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66 69  LITE_TEST.# defi
3530: 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29 20  ne TEST_INCR(x) 
3540: 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   x++.#else.# def
3550: 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29  ine TEST_INCR(x)
3560: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
3570: 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74 68  hese are bits th
3580: 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e  at can be set in
3590: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a   Pager.errMask..
35a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
35b0: 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78  _ERR_FULL     0x
35c0: 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29  01  /* a write()
35d0: 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69   failed */.#defi
35e0: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  ne PAGER_ERR_MEM
35f0: 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d        0x02  /* m
3600: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a  alloc() failed *
3610: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3620: 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30  ERR_LOCK     0x0
3630: 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74  4  /* error in t
3640: 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  he locking proto
3650: 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  col */.#define P
3660: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
3670: 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62    0x08  /* datab
3680: 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63  ase or journal c
3690: 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65  orruption */.#de
36a0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44  fine PAGER_ERR_D
36b0: 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a  ISK     0x10  /*
36c0: 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f   general disk I/
36d0: 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61  O error - bad ha
36e0: 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a  rd drive? */../*
36f0: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3700: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3720: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
3730: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
3740: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
3750: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
3760: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
3770: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
3780: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3790: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
37a0: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
37b0: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
37c0: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
37d0: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
37e0: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
37f0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3800: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
3810: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3820: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3830: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3840: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3850: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3860: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3870: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3880: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3890: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
38a0: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
38b0: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
38c0: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
38d0: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
38e0: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
38f0: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3900: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3910: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3920: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3930: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3940: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3950: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3960: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3970: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3980: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3990: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
39a0: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
39b0: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
39c0: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
39d0: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
39e0: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
39f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3a00: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3a10: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3a20: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3a30: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3a40: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3a50: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3a60: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3a70: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3a80: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3a90: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3aa0: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3ab0: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3ac0: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3ad0: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3ae0: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3af0: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3b00: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3b10: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3b20: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3b30: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3b40: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3b50: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3b60: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3b70: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3b80: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3b90: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3ba0: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3bb0: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3bc0: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3bd0: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3be0: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3bf0: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3c00: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3c10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3c20: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3c30: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3c40: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3c50: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3c60: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3c70: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3c80: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3c90: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3ca0: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3cb0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3cc0: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3cd0: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3ce0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3cf0: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3d00: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3d10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3d20: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3d30: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3d40: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3d50: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3d60: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3d70: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3d80: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
3d90: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
3da0: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
3db0: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
3dc0: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
3dd0: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
3de0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
3df0: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
3e00: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
3e10: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
3e20: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
3e30: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
3e40: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
3e50: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
3e60: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
3e70: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
3e80: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
3e90: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
3ea0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
3eb0: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
3ec0: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
3ed0: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
3ee0: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
3ef0: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
3f00: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
3f10: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
3f20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3f30: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
3f40: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
3f50: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
3f60: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
3f70: 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c  /*.** The defaul
3f80: 74 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b  t size of a disk
3f90: 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69   sector.*/.#defi
3fa0: 6e 65 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  ne PAGER_SECTOR_
3fb0: 53 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  SIZE 512../*.** 
3fc0: 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45  Page number PAGE
3fd0: 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76  R_MJ_PGNO is nev
3fe0: 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51  er used in an SQ
3ff0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69  Lite database (i
4000: 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64  t is.** reserved
4010: 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f   for working aro
4020: 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f  und a windows/po
4030: 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c  six incompatibil
4040: 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75  ity). It is.** u
4050: 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  sed in the journ
4060: 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  al to signify th
4070: 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  at the remainder
4080: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
4090: 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f  file .** is devo
40a0: 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61  ted to storing a
40b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
40c0: 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65  name - there are
40d0: 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74   no more pages t
40e0: 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20  o.** roll back. 
40f0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72  See comments for
4100: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d   function writeM
4110: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66  asterJournal() f
4120: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f  or details..*/./
4130: 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  * #define PAGER_
4140: 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44  MJ_PGNO(x) (PEND
4150: 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70  ING_BYTE/((x)->p
4160: 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65  ageSize)) */.#de
4170: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4180: 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f  NO(x) ((PENDING_
4190: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
41a0: 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20  ize))+1)../*.** 
41b0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  The maximum lega
41c0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  l page number is
41d0: 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a   (2^31 - 1)..*/.
41e0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41  #define PAGER_MA
41f0: 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34  X_PGNO 214748364
4200: 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  7../*.** Enable 
4210: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
4220: 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65  tracking (for de
4230: 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a  bugging) here:.*
4240: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4250: 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65  DEBUG.  int page
4260: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
4270: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
4280: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
4290: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
42a0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
42b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
42c0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
42d0: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
42e0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
42f0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
4300: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
4310: 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  %p nRef=%d\n",. 
4320: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4330: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4340: 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a   p->nRef.    );.
4350: 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20      cnt++;   /* 
4360: 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74  Something to set
4370: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e   a breakpoint on
4380: 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65   */.  }.# define
4390: 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67   REFINFO(X)  pag
43a0: 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65  er_refinfo(X).#e
43b0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46  lse.# define REF
43c0: 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a  INFO(X).#endif..
43d0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
43e0: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
43f0: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4400: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
4410: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
4420: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
4430: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
4440: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
4450: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
4460: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
4470: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
4480: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
4490: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
44a0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
44b0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
44c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
44d0: 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ead32bits(OsFile
44e0: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
44f0: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
4500: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
4510: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
4520: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
4530: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4540: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
4550: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4560: 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61  4];.    memcpy(a
4570: 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20  c, &res, 4);.   
4580: 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32   res = (ac[0]<<2
4590: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
45a0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
45b0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52  ac[3];.  }.  *pR
45c0: 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75  es = res;.  retu
45d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
45e0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
45f0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4600: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4610: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4620: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4630: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4640: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4650: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4670: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4680: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4690: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
46a0: 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20   ac[4];.  ac[0] 
46b0: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
46c0: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
46d0: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
46e0: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
46f0: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
4700: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
4710: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4720: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4730: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   4);.}../*.** Wr
4740: 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20 69  ite the 32-bit i
4750: 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e 74  nteger 'val' int
4760: 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  o the page ident
4770: 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68 65  ified by page he
4780: 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f  ader.** 'p' at o
4790: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e 0a  ffset 'offset'..
47a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
47b0: 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20 76  tore32bits(u32 v
47c0: 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e  al, PgHdr *p, in
47d0: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
47e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
47f0: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4800: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4810: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4820: 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  t];.  ac[0] = (v
4830: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4840: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4850: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4860: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
4870: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4880: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
4890: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
48a0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
48b0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
48c0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
48d0: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
48e0: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
48f0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4900: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4910: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4920: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4930: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4940: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4950: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4960: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4970: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4980: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4990: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
49a0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  [3];.}.../*.** C
49b0: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
49c0: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
49d0: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
49e0: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
49f0: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
4a00: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
4a10: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
4a20: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
4a30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4a50: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
4a60: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
4a70: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
4a80: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
4a90: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
4aa0: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
4ab0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
4ac0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4ad0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
4ae0: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
4af0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
4b00: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4b10: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
4b20: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
4b30: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
4b40: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4b50: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
4b60: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
4b70: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
4b80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
4b90: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
4ba0: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
4bb0: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
4bc0: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
4bd0: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
4be0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
4bf0: 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a  pagehash(PgHdr *
4c00: 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61  pPage){.  u32 ha
4c10: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
4c20: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4c30: 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67   *pData = (unsig
4c40: 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52  ned char *)PGHDR
4c50: 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b  _TO_DATA(pPage);
4c60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4c70: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
4c80: 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
4c90: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29   hash = (hash+i)
4ca0: 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20  ^pData[i];.  }. 
4cb0: 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a   return hash;.}.
4cc0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
4cd0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
4ce0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
4cf0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
4d00: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4d10: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
4d20: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
4d30: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
4d40: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
4d50: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
4d60: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
4d70: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
4d80: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
4d90: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
4da0: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
4db0: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
4dc0: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
4dd0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
4de0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
4df0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
4e00: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
4e10: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
4e20: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
4e30: 65 72 72 4d 61 73 6b 20 7c 7c 20 4d 45 4d 44 42  errMask || MEMDB
4e40: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
4e50: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
4e60: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
4e70: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
4e80: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
4e90: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65  CHECK_PAGE(x).#e
4ea0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  ndif../*.** When
4eb0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   this is called 
4ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4ed0: 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65   for pager pPage
4ee0: 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a  r must be open..
4ef0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
4f00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
4f10: 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  is read from the
4f20: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
4f30: 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e   and .** written
4f40: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
4f50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4f60: 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61  eMalloc(). *pzMa
4f70: 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74  ster is.** set t
4f80: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d  o point at the m
4f90: 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
4fa0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
4fb0: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a  e caller must.**
4fc0: 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70   sqliteFree() *p
4fd0: 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  zMaster..**.** I
4fe0: 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  f no master jour
4ff0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
5000: 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74   present *pzMast
5010: 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  er is set to 0 a
5020: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
5030: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5040: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5050: 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65  erJournal(OsFile
5060: 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a   *pJrnl, char **
5070: 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  pzMaster){.  int
5080: 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a   rc;.  u32 len;.
5090: 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32    i64 szJ;.  u32
50a0: 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b   cksum;.  int i;
50b0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
50c0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
50d0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
50e0: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
50f0: 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72   */..  *pzMaster
5100: 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71   = 0;..  rc = sq
5110: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
5120: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
5130: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5140: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
5150: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5160: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5170: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20  Jrnl, szJ-16);. 
5180: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5190: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
51a0: 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62   .  rc = read32b
51b0: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29  its(pJrnl, &len)
51c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
51d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
51e0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
51f0: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b  2bits(pJrnl, &ck
5200: 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
5210: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5220: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5230: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72  qlite3OsRead(pJr
5240: 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a  nl, aMagic, 8);.
5250: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5260: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
5270: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
5280: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
5290: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
52a0: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
52b0: 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20  , szJ-16-len);. 
52c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
52d0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
52e0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28  .  *pzMaster = (
52f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
5300: 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66  loc(len+1);.  if
5310: 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a  ( !*pzMaster ){.
5320: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5330: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
5340: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5350: 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74  d(pJrnl, *pzMast
5360: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
5370: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5380: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
5390: 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  *pzMaster);.    
53a0: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  *pzMaster = 0;. 
53b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
53c0: 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74  }..  /* See if t
53d0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63  he checksum matc
53e0: 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hes the master j
53f0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20  ournal name */. 
5400: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
5410: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
5420: 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b   -= (*pzMaster)[
5430: 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b  i];.  }.  if( ck
5440: 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sum ){.    /* If
5450: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f   the checksum do
5460: 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68  esn't add up, th
5470: 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  en one or more o
5480: 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f  f the disk secto
5490: 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69  rs.    ** contai
54a0: 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ning the master 
54b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
54c0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54   is corrupted. T
54d0: 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a  his means.    **
54e0: 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c   definitely roll
54f0: 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72   back, so just r
5500: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
5510: 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75  and report a (nu
5520: 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  l).    ** master
5530: 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d  -journal filenam
5540: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  e..    */.    sq
5550: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5560: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5570: 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  er = 0;.  }else{
5580: 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29  .    (*pzMaster)
5590: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  [len] = '\0';.  
55a0: 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53  }.   .  return S
55b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
55c0: 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  ** Seek the jour
55d0: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
55e0: 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  tor to the next 
55f0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
5600: 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e  where a.** journ
5610: 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65  al header may be
5620: 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
5630: 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  . Pager.journalO
5640: 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ff is updated wi
5650: 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65  th.** the new se
5660: 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a  ek offset..**.**
5670: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
5680: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
5690: 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65  *.** Input Offse
56a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f  t              O
56b0: 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20  utput Offset.** 
56c0: 2d 2d 2d 2d 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 0a 2a 2a 20 30 20 20 20 20  -------.** 0    
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20       0.** 512   
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20      512.** 100  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30       512.** 2000
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a        2048.** .*
5770: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
5780: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  kJournalHdr(Page
5790: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
57a0: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
57b0: 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e  i64 c = pPager->
57c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
57d0: 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  ( c ){.    offse
57e0: 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e  t = ((c-1)/JOURN
57f0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5800: 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c  ) + 1) * JOURNAL
5810: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5820: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
5830: 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44  ffset%JOURNAL_HD
5840: 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20  R_SZ(pPager)==0 
5850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
5860: 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65  set>=c );.  asse
5870: 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a  rt( (offset-c)<J
5880: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5890: 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65  ager) );.  pPage
58a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
58b0: 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  offset;.  return
58c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
58d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
58e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
58f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
5900: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
5910: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
5920: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5930: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a  lled. A journal.
5940: 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e  ** header (JOURN
5950: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
5960: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
5970: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5980: 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72  e at the.** curr
5990: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ent location..**
59a0: 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66  .** The format f
59b0: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  or the journal h
59c0: 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c  eader is as foll
59d0: 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65  ows:.** - 8 byte
59e0: 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66  s: Magic identif
59f0: 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ying journal for
5a00: 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  mat..** - 4 byte
5a10: 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63  s: Number of rec
5a20: 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c  ords in journal,
5a30: 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d   or -1 no-sync m
5a40: 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20  ode is on..** - 
5a50: 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20  4 bytes: Random 
5a60: 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20  number used for 
5a70: 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20  page hash..** - 
5a80: 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c  4 bytes: Initial
5a90: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
5aa0: 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  ount..** - 4 byt
5ab0: 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20  es: Sector size 
5ac0: 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63  used by the proc
5ad0: 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74  ess that wrote t
5ae0: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  his journal..** 
5af0: 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20  .** Followed by 
5b00: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
5b10: 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75  - 24) bytes of u
5b20: 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a  nused space..*/.
5b30: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
5b40: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5b50: 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e   *pPager){..  in
5b60: 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e  t rc = seekJourn
5b70: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
5b80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5b90: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
5ba0: 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61  journalHdr = pPa
5bb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
5bc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
5bd0: 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a  tmtHdrOff==0 ){.
5be0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
5bf0: 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  HdrOff = pPager-
5c00: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d  >journalHdr;.  }
5c10: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5c20: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
5c30: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
5c40: 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a  ..  /* FIX ME: .
5c50: 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62    **.  ** Possib
5c60: 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e  ly for a pager n
5c70: 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ot in no-sync mo
5c80: 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  de, the journal 
5c90: 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74  magic should not
5ca0: 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e  .  ** be written
5cb0: 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66   until nRec is f
5cc0: 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74  illed in as part
5cd0: 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75   of next syncJou
5ce0: 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20  rnal(). .  **.  
5cf0: 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62  ** Actually mayb
5d00: 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  e the whole jour
5d10: 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c  nal header shoul
5d20: 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74  d be delayed unt
5d30: 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69  il that.  ** poi
5d40: 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  nt. Think about 
5d50: 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  this..  */.  rc 
5d60: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
5d70: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
5d80: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
5d90: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
5da0: 69 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ic));..  if( rc=
5db0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5dc0: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
5dd0: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
5de0: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
5df0: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20  nals. */.    rc 
5e00: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
5e10: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5e20: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66  er->noSync ? 0xf
5e30: 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20  fffffff : 0);.  
5e40: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
5e50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
5e60: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
5e70: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
5e80: 72 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65  r */ .    sqlite
5e90: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
5ea0: 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  of(pPager->cksum
5eb0: 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e  Init), &pPager->
5ec0: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20  cksumInit);.    
5ed0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
5ee0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5ef0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5f00: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
5f10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5f20: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
5f30: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
5f40: 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
5f50: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5f60: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  jfd, pPager->dbS
5f70: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ize);.  }.  if( 
5f80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5f90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75  .    /* The assu
5fa0: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
5fb0: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
5fc0: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
5fd0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
5fe0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
5ff0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a  ectorSize);.  }.
6000: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
6010: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
6020: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
6030: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
6040: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
6050: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
6060: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6070: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
6080: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
6090: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
60a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
60b0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
60c0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
60d0: 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20  journalOff-1);. 
60e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
60f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
6100: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6110: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
6120: 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20  "\000", 1);.    
6130: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6140: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
6150: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
6160: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
6170: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
6180: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6190: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
61a0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
61b0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
61c0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
61d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
61e0: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
61f0: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
6200: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
6210: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
6220: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
6230: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
6240: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
6250: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
6260: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6270: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
6280: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
6290: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
62a0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
62b0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
62c0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
62d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
62e0: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
62f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
6300: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
6310: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
6320: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
6330: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
6340: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
6350: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
6360: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
6370: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
6380: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
6390: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
63a0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
63b0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
63c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
63d0: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
63e0: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
63f0: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
6400: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
6410: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
6420: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
6430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
6440: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
6450: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
6460: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
6470: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
6480: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
6490: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
64a0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
64b0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
64c0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
64d0: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
64e0: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
64f0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
6500: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
6510: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6520: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
6530: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6540: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6550: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
6560: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
6570: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
6580: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6590: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
65a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
65b0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
65c0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
65d0: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
65e0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
65f0: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
6600: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
6610: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
6620: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
6630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
6640: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
6650: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
6660: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6670: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6680: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6690: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
66a0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
66b0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
66c0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
66d0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
66e0: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
66f0: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6700: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6710: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6720: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6730: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6740: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6750: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6760: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
6770: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
6780: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
6790: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
67a0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
67b0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
67c0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
67d0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
67e0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
67f0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6800: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6810: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6820: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6830: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6840: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6850: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6860: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6870: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6880: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
6890: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
68a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
68b0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
68c0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
68d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
68e0: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
68f0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
6900: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6910: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65  ournalOff);.  re
6920: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
6930: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
6940: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
6950: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
6960: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6970: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
6980: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
6990: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
69a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
69b0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
69c0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
69d0: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
69e0: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
69f0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
6a00: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
6a10: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
6a20: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
6a30: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
6a40: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
6a50: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
6a60: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
6a70: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
6a80: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
6a90: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
6aa0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
6ab0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
6ac0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
6ad0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
6ae0: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
6af0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6b00: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
6b10: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
6b20: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
6b30: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
6b40: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
6b50: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
6b60: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
6b70: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
6b80: 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  l name..*/.stati
6b90: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
6ba0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
6bb0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
6bc0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
6bd0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
6be0: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
6bf0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a  u32 cksum = 0; .
6c00: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
6c10: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
6c20: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
6c30: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
6c40: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
6c50: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
6c60: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
6c70: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
6c80: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
6c90: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
6ca0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
6cb0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
6cc0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
6cd0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
6ce0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
6cf0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6d00: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
6d10: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
6d20: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
6d30: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
6d40: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
6d50: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
6d60: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
6d70: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
6d80: 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72     rc = seekJour
6d90: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6da0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
6db0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6dc0: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
6dd0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
6de0: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
6df0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
6e00: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
6e10: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
6e20: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6e30: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6e40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6e50: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
6e60: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
6e70: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
6e80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6e90: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6ea0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
6eb0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b  ager->jfd, len);
6ec0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6ed0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6ee0: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6ef0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6f00: 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  fd, cksum);.  if
6f10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6f20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6f30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6f40: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
6f50: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6f60: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
6f70: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
6f80: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  r->needSync = !p
6f90: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20  Pager->noSync;. 
6fa0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6fb0: 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f  *.** Add or remo
6fc0: 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  ve a page from t
6fd0: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
6fe0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
6ff0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   the.** statemen
7000: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
7010: 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73   The Pager keeps
7020: 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74   a separate list
7030: 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61   of pages that a
7040: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a  re currently in.
7050: 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
7060: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20   journal.  This 
7070: 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65  helps the sqlite
7080: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
7090: 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  it().** routine 
70a0: 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20  run MUCH faster 
70b0: 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
70c0: 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20  ase where there 
70d0: 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65  are many.** page
70e0: 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20  s in memory but 
70f0: 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69  only a few are i
7100: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
7110: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
7120: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64  ic void page_add
7130: 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  _to_stmt_list(Pg
7140: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
7150: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
7160: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
7170: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7180: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
7190: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  pPg->pPrevStmt==
71a0: 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53  0 && pPg->pNextS
71b0: 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d  tmt==0 );.  pPg-
71c0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a  >pPrevStmt = 0;.
71d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53    if( pPager->pS
71e0: 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65  tmt ){.    pPage
71f0: 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53  r->pStmt->pPrevS
7200: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  tmt = pPg;.  }. 
7210: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7220: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7230: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
7240: 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69   = pPg;.  pPg->i
7250: 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61  nStmt = 1;.}.sta
7260: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65  tic void page_re
7270: 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
7280: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
7290: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53  .  if( !pPg->inS
72a0: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
72b0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  if( pPg->pPrevSt
72c0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
72d0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
72e0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67  ->pNextStmt==pPg
72f0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
7300: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
7310: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
7320: 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  mt;.  }else{.   
7330: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
7340: 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67  ager->pStmt==pPg
7350: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61   );.    pPg->pPa
7360: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7370: 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d  ->pNextStmt;.  }
7380: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
7390: 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73  tStmt ){.    ass
73a0: 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53  ert( pPg->pNextS
73b0: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d  tmt->pPrevStmt==
73c0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
73d0: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
73e0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Stmt = pPg->pPre
73f0: 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67  vStmt;.  }.  pPg
7400: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
7410: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
7420: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e  t = 0;.  pPg->in
7430: 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
7440: 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69  ** Find a page i
7450: 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
7460: 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20   given its page 
7470: 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a  number.  Return.
7480: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7490: 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c  the page or NULL
74a0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
74b0: 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
74c0: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67  pager_lookup(Pag
74d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
74e0: 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
74f0: 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  *p = pPager->aHa
7500: 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67  sh[pager_hash(pg
7510: 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70  no)];.  while( p
7520: 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e   && p->pgno!=pgn
7530: 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e  o ){.    p = p->
7540: 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
7550: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
7560: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64  .** Unlock the d
7570: 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61  atabase and clea
7580: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
7590: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
75a0: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
75b0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
75c0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
75d0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
75e0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
75f0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
7600: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
7610: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
7620: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
7630: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
7640: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
7650: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
7660: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
7670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7680: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
7690: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
76a0: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
76b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
76c0: 72 4d 61 73 6b 20 29 20 72 65 74 75 72 6e 3b 0a  rMask ) return;.
76d0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
76e0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
76f0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
7700: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
7710: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
7720: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
7730: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
7740: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
7750: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
7760: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
7770: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
7780: 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ll = 0;.  memset
7790: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
77a0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
77b0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61  ->aHash));.  pPa
77c0: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
77d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
77e0: 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
77f0: 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  VED ){.    sqlit
7800: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
7810: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
7820: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7830: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
7840: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7850: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
7860: 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d  NLOCK;.  pPager-
7870: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
7880: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
7890: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
78a0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
78b0: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0 );.}../*.** T
78c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
78d0: 75 73 65 64 20 74 6f 20 72 65 73 65 74 20 74 68  used to reset th
78e0: 65 20 70 61 67 65 72 20 61 66 74 65 72 20 61 20  e pager after a 
78f0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
7900: 2e 20 54 68 69 73 0a 2a 2a 20 64 6f 65 73 6e 27  . This.** doesn'
7910: 74 20 77 6f 72 6b 20 77 69 74 68 20 69 6e 2d 6d  t work with in-m
7920: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
7930: 20 49 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   If a malloc() f
7940: 61 69 6c 73 20 77 68 65 6e 20 61 6e 20 0a 2a 2a  ails when an .**
7950: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7960: 61 73 65 20 69 73 20 69 6e 20 75 73 65 20 69 74  ase is in use it
7970: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
7980: 20 74 6f 20 72 65 63 6f 76 65 72 2e 0a 2a 2a 0a   to recover..**.
7990: 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
79a0: 69 6f 6e 20 6f 72 20 73 74 61 74 65 6d 65 6e 74  ion or statement
79b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
79c0: 61 63 74 69 76 65 2c 20 69 74 20 69 73 20 72 6f  active, it is ro
79d0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
79e0: 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
79f0: 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  to call this fun
7a00: 63 74 69 6f 6e 20 69 66 20 61 6e 79 20 70 61 67  ction if any pag
7a10: 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
7a20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7a30: 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f  _OMIT_GLOBALRECO
7a40: 56 45 52 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  VER.int sqlite3p
7a50: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
7a60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7a70: 20 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 69   pPager ){.    i
7a80: 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  f( pPager->nRef 
7a90: 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  || MEMDB ){.    
7aa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ab0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7ac0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
7ad0: 20 26 3d 20 7e 28 50 41 47 45 52 5f 45 52 52 5f   &= ~(PAGER_ERR_
7ae0: 4d 45 4d 29 3b 0a 20 20 20 20 70 61 67 65 72 5f  MEM);.    pager_
7af0: 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
7b00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
7b10: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
7b20: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
7b30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
7b40: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
7b50: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
7b60: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
7b70: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
7b80: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
7b90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
7ba0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
7bb0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
7bc0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
7bd0: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
7be0: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
7bf0: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
7c00: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
7c10: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
7c20: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
7c30: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
7c40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7c50: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
7c60: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
7c70: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
7c80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
7c90: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
7ca0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
7cb0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
7cc0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
7cd0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
7ce0: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
7cf0: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
7d00: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
7d10: 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Pg;.  int rc;.  
7d20: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
7d30: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7d40: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
7d50: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
7d60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7d70: 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  }.  sqlite3pager
7d80: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61  _stmt_commit(pPa
7d90: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
7da0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
7db0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7dc0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
7dd0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
7de0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
7df0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
7e00: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
7e10: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7e20: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
7e30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
7e40: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  nalOpen = 0;.   
7e50: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
7e60: 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
7e70: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  l);.    sqliteFr
7e80: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
7e90: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
7ea0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7eb0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
7ec0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7ed0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
7ee0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
7ef0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
7f00: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
7f10: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
7f20: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
7f30: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7f40: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
7f50: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
7f60: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
7f70: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
7f80: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
7f90: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
7fa0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
7fb0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
7fc0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
7fd0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
7fe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7ff0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8000: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
8010: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
8020: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
8030: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
8040: 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
8050: 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72  _LOCK);.  pPager
8060: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8070: 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72  SHARED;.  pPager
8080: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
8090: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
80a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65 74  aster = 0;.  ret
80b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
80c0: 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74   Compute and ret
80d0: 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66  urn a checksum f
80e0: 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64  or the page of d
80f0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ata..**.** This 
8100: 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68  is not a real ch
8110: 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72  ecksum.  It is r
8120: 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73  eally just the s
8130: 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61  um of the .** ra
8140: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c  ndom initial val
8150: 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  ue and the page 
8160: 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65  number.  We expe
8170: 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a  rimented with.**
8180: 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74   a checksum of t
8190: 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20  he entire data, 
81a0: 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75  but that was fou
81b0: 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f  nd to be too slo
81c0: 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  w..**.** Note th
81d0: 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  at the page numb
81e0: 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20  er is stored at 
81f0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
8200: 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65   data and.** the
8210: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f   checksum is sto
8220: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20  red at the end. 
8230: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
8240: 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a  nt.  If journal.
8250: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63  ** corruption oc
8260: 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f  curs due to a po
8270: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
8280: 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65   most likely sce
8290: 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74  nario.** is that
82a0: 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20   one end or the 
82b0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63  other of the rec
82c0: 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ord will be chan
82d0: 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d  ged.  It is.** m
82e0: 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20  uch less likely 
82f0: 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64  that the two end
8300: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8310: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a   record will be.
8320: 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74  ** correct and t
8330: 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72  he middle be cor
8340: 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69  rupt.  Thus, thi
8350: 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68  s "checksum" sch
8360: 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66  eme,.** though f
8370: 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20  ast and simple, 
8380: 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74  catches the most
8390: 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f  ly likely kind o
83a0: 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a  f corruption..**
83b0: 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e  .** FIX ME:  Con
83c0: 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65  sider adding eve
83d0: 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29  ry 200th (or so)
83e0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74   byte of the dat
83f0: 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63  a to the.** chec
8400: 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20  ksum.  That way 
8410: 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  if a single page
8420: 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65   spans 3 or more
8430: 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e   disk sectors an
8440: 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69  d.** only the mi
8450: 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63  ddle sector is c
8460: 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20  orrupt, we will 
8470: 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61  still have a rea
8480: 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63  sonable.** chanc
8490: 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65  e of failing the
84a0: 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68   checksum and th
84b0: 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65  us detecting the
84c0: 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61   problem..*/.sta
84d0: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b  tic u32 pager_ck
84e0: 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65  sum(Pager *pPage
84f0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f  r, Pgno pgno, co
8500: 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29  nst char *aData)
8510: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
8520: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
8530: 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  t;.  int i = pPa
8540: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
8550: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  0;.  while( i>0 
8560: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
8570: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
8580: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
8590: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
85a0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
85b0: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
85c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
85d0: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
85e0: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
85f0: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
8600: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
8610: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
8620: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
8630: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
8640: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
8650: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
8660: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
8670: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
8680: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
8690: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
86a0: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
86b0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
86c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
86d0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
86e0: 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70  ne_page(Pager *p
86f0: 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a  Pager, OsFile *j
8700: 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d  fd, int useCksum
8710: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
8720: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8740: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
8750: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
8760: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8780: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
8790: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
87a0: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
87b0: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
87d0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
87e0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
87f0: 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53   */.  u8 aData[S
8800: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
8810: 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73  IZE];  /* Temp s
8820: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
8830: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b  e */..  /* useCk
8840: 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72  sum should be tr
8850: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
8860: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
8870: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
8880: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
8890: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
88a0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
88b0: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
88c0: 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b  t( jfd == (useCk
88d0: 73 75 6d 20 3f 20 26 70 50 61 67 65 72 2d 3e 6a  sum ? &pPager->j
88e0: 66 64 20 3a 20 26 70 50 61 67 65 72 2d 3e 73 74  fd : &pPager->st
88f0: 66 64 29 20 29 3b 0a 0a 0a 20 20 72 63 20 3d 20  fd) );...  rc = 
8900: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
8910: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
8920: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8930: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
8940: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
8950: 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61 67 65  d, &aData, pPage
8960: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
8970: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8980: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
8990: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
89a0: 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
89b0: 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20  ageSize + 4;..  
89c0: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
89d0: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
89e0: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
89f0: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
8a00: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
8a10: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
8a20: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
8a30: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
8a40: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
8a50: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
8a60: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
8a70: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
8a80: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
8a90: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
8aa0: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
8ab0: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
8ac0: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
8ad0: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
8ae0: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
8af0: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
8b00: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
8b10: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
8b20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8b30: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
8b40: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
8b50: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
8b60: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
8b70: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
8b80: 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20   useCksum ){.   
8b90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8ba0: 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  (jfd, &cksum);. 
8bb0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
8bc0: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
8bd0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
8be0: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
8bf0: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
8c00: 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b  pgno, aData)!=ck
8c10: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
8c20: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
8c30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
8c40: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
8c50: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
8c60: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
8c70: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
8c80: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
8c90: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
8ca0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
8cb0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
8cc0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
8cd0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
8ce0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
8cf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
8d00: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
8d10: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
8d20: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
8d30: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
8d40: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
8d50: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
8d60: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
8d70: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
8d80: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
8d90: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
8da0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
8db0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
8dc0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
8dd0: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
8de0: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
8df0: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
8e00: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
8e10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
8e20: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
8e30: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
8e40: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
8e50: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
8e60: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
8e70: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
8e80: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
8e90: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
8ea0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
8eb0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
8ec0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
8ed0: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
8ee0: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
8ef0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
8f00: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
8f10: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
8f20: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
8f30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
8f40: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
8f50: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
8f60: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
8f70: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
8f80: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
8f90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  in the main roll
8fa0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
8fb0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69  l.  Otherwise, i
8fc0: 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  f a full ROLLBAC
8fd0: 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  K occurs after t
8fe0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  he statement.  *
8ff0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66  * rollback the f
9000: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c  ull ROLLBACK wil
9010: 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68  l not restore th
9020: 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72  e page to its or
9030: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74  iginal.  ** cont
9040: 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  ent.  Two condit
9050: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
9060: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
9070: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9080: 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20    ** files. (1) 
9090: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
90a0: 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32  t be locked.  (2
90b0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
90c0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
90d0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
90e0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
90f0: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
9100: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
9110: 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68  not in.  ** cach
9120: 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  e or else it is 
9130: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
9140: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
9150: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
9160: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
9170: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9180: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9190: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21  XCLUSIVE || pPg!
91a0: 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22  =0 );.  TRACE3("
91b0: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
91c0: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
91d0: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
91e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
91f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9200: 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20  SIVE && (pPg==0 
9210: 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  || pPg->needSync
9220: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==0) ){.    rc =
9230: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
9240: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9250: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9260: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9270: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9280: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9290: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
92a0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  &pPager->fd, aDa
92b0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
92c0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
92d0: 20 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e   if( pPg ) pPg->
92e0: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
92f0: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
9300: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
9310: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
9320: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
9330: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
9340: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
9350: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
9360: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
9370: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
9380: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
9390: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
93a0: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
93b0: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
93c0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
93d0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
93e0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
93f0: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
9400: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
9410: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
9420: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
9430: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
9440: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
9450: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
9460: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9470: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
9480: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
9490: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
94a0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
94b0: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
94c0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
94d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
94e0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f  Destructor ){  /
94f0: 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f  *** FIX ME:  Sho
9500: 75 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69  uld this be xRei
9510: 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20  nit? ***/.      
9520: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9530: 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
9540: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9550: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
9560: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
9570: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
9580: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
9590: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
95a0: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
95b0: 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
95c0: 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 3);.  }.  retu
95d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
95e0: 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65  Parameter zMaste
95f0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
9600: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
9610: 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65  l file. A single
9620: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9630: 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74   that referred t
9640: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
9650: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75  rnal file has ju
9660: 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  st been rolled b
9670: 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ack..** This rou
9680: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69  tine checks if i
9690: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
96a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
96b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  er journal file,
96c0: 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20  .** and does so 
96d0: 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  if it is..**.** 
96e0: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
96f0: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
9700: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
9710: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
9720: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
9730: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9740: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
9750: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
9760: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
9770: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
9780: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
9790: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
97a0: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
97b0: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
97c0: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
97d0: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
97e0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
97f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9800: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
9810: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
9820: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
9830: 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65    int master_ope
9840: 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20  n = 0;.  OsFile 
9850: 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a  master;.  char *
9860: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9870: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
9880: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9890: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
98a0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
98b0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
98c0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
98d0: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
98e0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
98f0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
9900: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
9910: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
9920: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
9930: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
9940: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
9950: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
9960: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
9970: 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65  .  memset(&maste
9980: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73  r, 0, sizeof(mas
9990: 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ter));.  rc = sq
99a0: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
99b0: 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  nly(zMaster, &ma
99c0: 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ster);.  if( rc!
99d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
99e0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
99f0: 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  .  master_open =
9a00: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
9a10: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61  e3OsFileSize(&ma
9a20: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
9a30: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
9a40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
9a50: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
9a60: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
9a70: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
9a80: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
9a90: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
9aa0: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
9ab0: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
9ac0: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
9ad0: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
9ae0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
9af0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
9b00: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
9b10: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
9b20: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
9b30: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
9b40: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
9b50: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
9b60: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
9b70: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
9b80: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
9b90: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9ba0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9bb0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
9bc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9bd0: 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a  sRead(&master, z
9be0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
9bf0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9c00: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
9c10: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9c20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
9c30: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
9c40: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
9c50: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
9c60: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
9c70: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
9c80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9c90: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
9ca0: 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  (zJournal) ){.  
9cb0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
9cc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
9cd0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
9ce0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
9cf0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
9d00: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
9d10: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
9d20: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
9d30: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
9d40: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
9d50: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
9d60: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9d70: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
9d80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46    */.        OsF
9d90: 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20  ile journal;.   
9da0: 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20       int c;..   
9db0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75       memset(&jou
9dc0: 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  rnal, 0, sizeof(
9dd0: 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20  journal));.     
9de0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9df0: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a  sOpenReadOnly(zJ
9e00: 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c  ournal, &journal
9e10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
9e20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
9e40: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9e50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9e60: 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
9e70: 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c  Journal(&journal
9e80: 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  , &zMasterPtr);.
9e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
9ea0: 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29  sClose(&journal)
9eb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9ec0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9ed0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9ee0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9ef0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9f00: 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d  c = zMasterPtr!=
9f10: 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73  0 && strcmp(zMas
9f20: 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29  terPtr, zMaster)
9f30: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ==0;.        sql
9f40: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50  iteFree(zMasterP
9f50: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  tr);.        if(
9f60: 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   c ){.          
9f70: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
9f80: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
9f90: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
9fa0: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
9fb0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9fc0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9fd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9fe0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
9ff0: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
a000: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
a010: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
a020: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
a030: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
a040: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
a050: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
a060: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
a070: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
a080: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
a090: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
a0a0: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
a0b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
a0d0: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
a0e0: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
a0f0: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
a100: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
a110: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
a120: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
a130: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
a140: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
a150: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
a160: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
a170: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
a180: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
a190: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
a1a0: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
a1b0: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
a1c0: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
a1d0: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
a1e0: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
a1f0: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
a200: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
a210: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
a220: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
a230: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
a240: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a250: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
a260: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
a270: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
a280: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a290: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
a2a0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
a2b0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
a2c0: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
a2d0: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  zBuf[SQLITE_MAX_
a2e0: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
a2f0: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
a300: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a310: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
a320: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
a330: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
a340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a350: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
a360: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a370: 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e 70 67  ze*(i64)(pPg->pg
a380: 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20 69 66  no-1));.      if
a390: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a3a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
a3b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
a3c0: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a3d0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a3e0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a3f0: 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54 43    TRACE3("REFETC
a400: 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
a410: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
a420: 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
a430: 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
a440: 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  ak;.      CODEC(
a450: 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50  pPager, zBuf, pP
a460: 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20  g->pgno, 2);.   
a470: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
a480: 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50  mset(zBuf, 0, pP
a490: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a4a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
a4b0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d  Pg->nRef==0 || m
a4c0: 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44  emcmp(zBuf, PGHD
a4d0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a4e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a4f0: 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) ){.      memcp
a500: 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
a510: 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67  pPg), zBuf, pPag
a520: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a530: 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
a540: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
a550: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
a560: 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
a570: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a580: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a5a0: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
a5b0: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
a5c0: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
a5d0: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
a5e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
a5f0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
a600: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
a610: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
a620: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
a630: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
a640: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
a650: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
a660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
a670: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
a680: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
a690: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
a6a0: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
a6b0: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
a6c0: 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  icated..*/.stati
a6d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
a6e0: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
a6f0: 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  er, int nPage){.
a700: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
a710: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
a720: 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72 65  XCLUSIVE );.  re
a730: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72  turn sqlite3OsTr
a740: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
a750: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
a760: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
a770: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
a780: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
a790: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
a7a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a7b0: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
a7c0: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
a7d0: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
a7e0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
a7f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
a800: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
a810: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
a820: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
a830: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
a840: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
a850: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
a860: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
a870: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a880: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a890: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
a8a0: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
a8b0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
a8c0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
a8d0: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
a8e0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
a8f0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
a900: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
a910: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
a920: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
a930: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
a940: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a950: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
a960: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
a970: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
a980: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
a990: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
a9a0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
a9b0: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
a9c0: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
a9d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
a9e0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
a9f0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
aa00: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
aa10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
aa20: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
aa30: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
aa40: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
aa50: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
aa60: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
aa70: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
aa80: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
aa90: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
aaa0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
aab0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
aac0: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
aad0: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
aae0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
aaf0: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
ab00: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
ab10: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
ab20: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
ab30: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
ab40: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
ab50: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
ab60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
ab70: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
ab80: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
ab90: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
aba0: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
abb0: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
abc0: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
abd0: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
abe0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
abf0: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
ac00: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
ac10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
ac20: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
ac30: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
ac40: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
ac50: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
ac60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
ac70: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
ac80: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
ac90: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
aca0: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
acb0: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
acc0: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
acd0: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
ace0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
acf0: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
ad00: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
ad10: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
ad20: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
ad30: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
ad40: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
ad50: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
ad60: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
ad70: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
ad80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
ad90: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
ada0: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
adb0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
adc0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
add0: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
ade0: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
adf0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
ae00: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
ae10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
ae20: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
ae30: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
ae40: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
ae50: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
ae60: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
ae70: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
ae80: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
ae90: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
aea0: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
aeb0: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
aec0: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
aed0: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
aee0: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
aef0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
af00: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
af10: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
af20: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
af30: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
af40: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
af50: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
af60: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
af70: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
af80: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
af90: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
afa0: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
afb0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
afc0: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
afd0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
afe0: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
aff0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
b000: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
b010: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
b020: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
b030: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
b040: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
b050: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
b060: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
b070: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
b080: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
b090: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
b0a0: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
b0b0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
b0c0: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
b0d0: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
b0e0: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
b0f0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
b100: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
b110: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
b120: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
b130: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
b140: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
b150: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
b160: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
b170: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
b180: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
b190: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
b1a0: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
b1b0: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
b1c0: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
b1d0: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
b1e0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
b1f0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
b200: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
b210: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
b220: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
b230: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
b260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
b270: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
b280: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
b290: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b2a0: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
b2b0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
b2c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
b2d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b2e0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
b2f0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
b300: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
b310: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
b320: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
b330: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
b340: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
b350: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
b360: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
b370: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
b380: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
b390: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b3a0: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
b3b0: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
b3c0: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
b3d0: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
b3e0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
b3f0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
b400: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
b410: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
b420: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
b430: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
b440: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
b450: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
b460: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b470: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
b480: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b490: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
b4a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b4b0: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
b4c0: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
b4d0: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
b4e0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
b4f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
b500: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
b510: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
b520: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
b530: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
b540: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
b550: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
b560: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
b570: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
b580: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
b590: 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65  erJournal(&pPage
b5a0: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
b5b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
b5c0: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
b5d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b5e0: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
b5f0: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
b600: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
b610: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
b620: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
b630: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
b640: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b650: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
b660: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
b670: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
b680: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
b690: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
b6a0: 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
b6b0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
b6c0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
b6d0: 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
b6e0: 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
b6f0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
b700: 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
b710: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
b720: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
b730: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
b740: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
b750: 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
b760: 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
b770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
b780: 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
b790: 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
b7a0: 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
b7b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
b7c0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
b7d0: 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
b7e0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
b7f0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
b800: 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
b810: 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
b820: 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
b830: 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
b840: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
b850: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
b860: 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
b870: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
b880: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
b890: 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
b8a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
b8b0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b8c0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
b8d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
b8e0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
b8f0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b900: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
b910: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
b920: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b930: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
b940: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
b950: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
b960: 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
b970: 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
b980: 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
b990: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
b9a0: 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
b9b0: 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
b9c0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
b9d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
b9e0: 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
b9f0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
ba00: 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
ba10: 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
ba20: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
ba30: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
ba40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
ba50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ba60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ba70: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
ba80: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
ba90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
baa0: 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
bab0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
bac0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
bad0: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
bae0: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
baf0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
bb00: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
bb10: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
bb20: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
bb30: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
bb40: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
bb50: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
bb60: 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20  EXCLUSIVE && .  
bb70: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
bb80: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
bb90: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bba0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
bbb0: 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
bbc0: 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Size==0 || pPage
bbd0: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d  r->origDbSize==m
bbe0: 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20  xPg );.      rc 
bbf0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
bc00: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
bc10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
bc20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bc30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
bc40: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
bc50: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
bc60: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
bc70: 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73 71  ..    /* rc = sq
bc80: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
bc90: 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41  ger->jfd, JOURNA
bca0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
bcb0: 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ); */.    if( rc
bcc0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
bcd0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
bce0: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  .  .    /* Copy 
bcf0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
bd00: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
bd10: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
bd20: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bd30: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
bd40: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
bd50: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
bd60: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
bd70: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
bd80: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
bd90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
bda0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bdb0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bdc0: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
bdd0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
bde0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
bdf0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
be00: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
be10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
be20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
be30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
be40: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
be50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be60: 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20 74   }..  /* Pages t
be70: 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  hat have been wr
be80: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
be90: 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20 73  rnal but never s
bea0: 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72 65  ynced.  ** where
beb0: 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62 79   not restored by
bec0: 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e   the loop above.
bed0: 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65 73    We have to res
bee0: 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20  tore those.  ** 
bef0: 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e 67  pages by reading
bf00: 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20   them back from 
bf10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
bf20: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  abase..  */.  as
bf30: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
bf40: 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f 72  _OK );.  pager_r
bf50: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
bf60: 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61  er);..end_playba
bf70: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
bf80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
bf90: 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
bfa0: 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
bfb0: 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72   }.  if( zMaster
bfc0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
bfd0: 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
bfe0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
bff0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
c000: 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20 20  eturn true,.    
c010: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
c020: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
c030: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
c040: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
c050: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c060: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
c070: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
c080: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
c090: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
c0a0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
c0b0: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
c0c0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
c0d0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
c0e0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
c0f0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
c100: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
c110: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
c120: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
c130: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
c140: 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52  ZE.  ** value. R
c150: 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63  eset it to the c
c160: 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72  orrect value for
c170: 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20   this process.. 
c180: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   */.  pPager->se
c190: 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52  ctorSize = PAGER
c1a0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
c1b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c1c0: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
c1d0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c1e0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
c1f0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
c200: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
c210: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
c220: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
c230: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
c240: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
c250: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
c260: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
c270: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
c280: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
c290: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
c2a0: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
c2b0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
c2c0: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
c2d0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
c2e0: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
c2f0: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
c300: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
c310: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
c320: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
c330: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
c340: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
c350: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
c360: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
c370: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
c380: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
c390: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
c3a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
c3b0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
c3c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
c3d0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
c3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c3f0: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
c400: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
c410: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
c420: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
c430: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
c440: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
c450: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c460: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c470: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
c480: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
c490: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
c4a0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
c4b0: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
c4c0: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
c4d0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
c4e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f  Pager->jfd, &os_
c4f0: 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  szJ);.    if( rc
c500: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c510: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73  turn rc;.    ass
c520: 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a  ert( szJ==os_szJ
c530: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
c540: 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20    /* Set hdrOff 
c550: 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74  to be the offset
c560: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a 6f   to the first jo
c570: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
c580: 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 73  tten.  ** this s
c590: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
c5a0: 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tion, or the end
c5b0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
c5c0: 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
c5d0: 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
c5e0: 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
c5f0: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
c600: 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
c610: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
c620: 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
c630: 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
c640: 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
c650: 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
c660: 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
c670: 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
c680: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
c690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
c6a0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
c6b0: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
c6c0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
c6d0: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
c6e0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b  ager->stmtSize);
c6f0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
c700: 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
c710: 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20  stmtSize;..  /* 
c720: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
c730: 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20  any records are 
c740: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
c750: 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20   journal..  */. 
c760: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c770: 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50  >stmtInUse && pP
c780: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c790: 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  n );.  sqlite3Os
c7a0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74  Seek(&pPager->st
c7b0: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
c7c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
c7d0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
c7e0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
c7f0: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
c800: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
c810: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
c820: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c830: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
c840: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
c850: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
c860: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
c870: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
c880: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
c890: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
c8a0: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
c8b0: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
c8c0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
c8d0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
c8e0: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
c8f0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
c900: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
c910: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
c920: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
c930: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c940: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c950: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
c960: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
c970: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
c980: 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
c990: 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
c9a0: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
c9b0: 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
c9c0: 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
c9d0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
c9e0: 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
c9f0: 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
ca00: 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
ca10: 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
ca20: 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
ca30: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
ca40: 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
ca50: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
ca60: 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
ca70: 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
ca80: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
ca90: 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
caa0: 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
cab0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
cac0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
cad0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
cae0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
caf0: 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
cb00: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
cb10: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
cb20: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
cb30: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
cb40: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
cb50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cb60: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
cb70: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
cb80: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
cb90: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
cba0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
cbb0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
cbc0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
cbd0: 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74  tCksum;.  assert
cbe0: 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ( JOURNAL_HDR_SZ
cbf0: 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65 72  (pPager)<(pPager
cc00: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b  ->pageSize+8) );
cc10: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
cc20: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20  ->journalOff <= 
cc30: 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d  (hdrOff-(pPager-
cc40: 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b  >pageSize+8)) ){
cc50: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
cc60: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
cc70: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
cc80: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
cc90: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cca0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
ccb0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ccc0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
ccd0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
cce0: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
ccf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
cd00: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65  J ){.    u32 nRe
cd10: 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79  c;.    u32 dummy
cd20: 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  ;.    rc = readJ
cd30: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
cd40: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64  , szJ, &nRec, &d
cd50: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
cd60: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cd70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
cd80: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
cd90: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
cda0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cdb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65     }.    if( nRe
cdc0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  c==0 ){.      nR
cdd0: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
cde0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
cdf0: 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
ce00: 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
ce10: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
ce20: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
ce30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
ce40: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
ce50: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
ce60: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
ce70: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
ce80: 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   1);.      asser
ce90: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cea0: 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NE );.      if( 
ceb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
cec0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
ced0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
cee0: 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  }..  pPager->jou
cef0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cf00: 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62   .end_stmt_playb
cf10: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  ack:.  if( rc!=S
cf20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cf30: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
cf40: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52  |= PAGER_ERR_COR
cf50: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53  RUPT;.    rc = S
cf60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
cf70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
cf80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
cf90: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
cfa0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
cfb0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
cfc0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
cfd0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
cfe0: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
cff0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d000: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d010: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d020: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61  ite3pager_set_ca
d030: 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  chesize(Pager *p
d040: 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
d050: 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
d060: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
d070: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
d080: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
d090: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d0a0: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
d0b0: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
d0c0: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
d0d0: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
d0e0: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
d0f0: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
d100: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
d110: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
d120: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
d130: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
d140: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d150: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
d160: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
d170: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
d180: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
d190: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
d1a0: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
d1b0: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
d1c0: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
d1d0: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
d1e0: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
d1f0: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
d200: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
d210: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
d220: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
d230: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d240: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
d250: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
d260: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
d270: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
d280: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
d290: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
d2a0: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
d2b0: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
d2c0: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
d2d0: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
d2e0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
d2f0: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
d300: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
d310: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
d320: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
d330: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
d340: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
d350: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
d360: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
d370: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
d380: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d390: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
d3a0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
d3b0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
d3c0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
d3d0: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
d3e0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
d3f0: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
d400: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
d410: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
d420: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
d430: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
d440: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
d460: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
d470: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
d480: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
d490: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
d4a0: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
d4b0: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
d4c0: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
d4d0: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
d4e0: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
d4f0: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
d500: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
d510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d520: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
d530: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
d540: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
d550: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
d560: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
d570: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
d580: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
d590: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
d5a0: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
d5b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
d5c0: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d5d0: 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74  AGMAS.void sqlit
d5e0: 65 33 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65  e3pager_set_safe
d5f0: 74 79 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a  ty_level(Pager *
d600: 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65  pPager, int leve
d610: 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  l){.  pPager->no
d620: 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31  Sync =  level==1
d630: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
d640: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
d650: 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c  fullSync = level
d660: 3d 3d 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==3 && !pPager->
d670: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20  tempFile;.  if( 
d680: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
d690: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d6a0: 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  c = 0;.}.#endif.
d6b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
d6c0: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
d6d0: 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  able is incremen
d6e0: 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65  ted whenever the
d6f0: 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65   library.** atte
d700: 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74  mpts to open a t
d710: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
d720: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
d730: 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
d740: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
d750: 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a  ysis only.  .*/.
d760: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
d770: 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
d780: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
d790: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57  mporary file.  W
d7a0: 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
d7b0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a   the file into z
d7c0: 46 69 6c 65 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d  File.** (zFile m
d7d0: 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
d7e0: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
d7f0: 53 49 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e  SIZE bytes long.
d800: 29 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  )  Write.** the 
d810: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d820: 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72  into *fd.  Retur
d830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
d840: 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a  uccess or some.*
d850: 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  * other error co
d860: 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a  de if we fail..*
d870: 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c  *.** The OS will
d880: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
d890: 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
d8a0: 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74  ary file when it
d8b0: 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a   is.** closed..*
d8c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
d8d0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
d8e0: 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20  mp(char *zFile, 
d8f0: 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69  OsFile *fd){.  i
d900: 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e  nt cnt = 8;.  in
d910: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
d920: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
d930: 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
d940: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
d950: 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f  sis only */.  do
d960: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
d970: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
d980: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
d990: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d9a0: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
d9b0: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
d9c0: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
d9d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
d9e0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
d9f0: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
da00: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
da10: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
da20: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
da30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
da40: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
da50: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
da60: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
da70: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
da80: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
da90: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
daa0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
dab0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
dac0: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
dad0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
dae0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
daf0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
db00: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
db10: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
db20: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
db30: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
db40: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
db50: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
db60: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
db70: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
db80: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
db90: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
dba0: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
dbb0: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
dbc0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
dbd0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
dbe0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
dbf0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
dc00: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
dc10: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
dc20: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
dc30: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
dc40: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
dc50: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
dc60: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
dc70: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
dc80: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
dc90: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
dca0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
dcb0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
dcc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dcd0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
dce0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
dcf0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
dd00: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
dd10: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
dd20: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
dd30: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
dd40: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
dd50: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd70: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
dd80: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
dd90: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
dda0: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
ddb0: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
ddc0: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
ddd0: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
dde0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ddf0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
de00: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
de10: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
de20: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
de30: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
de40: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
de50: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
de60: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
de70: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
de80: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
de90: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
dea0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
deb0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
dec0: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
ded0: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
dee0: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66  izeof(fd));.  if
def0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
df00: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
df10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
df20: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
df30: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
df40: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
df50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
df60: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
df70: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
df80: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
df90: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
dfa0: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
dfb0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
dfc0: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
dfd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
dfe0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
dff0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
e000: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
e010: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e020: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e030: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
e040: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
e050: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e060: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
e070: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
e080: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
e090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e0b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
e0c0: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
e0d0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
e0e0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
e0f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e100: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
e110: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
e120: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e130: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
e140: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
e150: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46   }.  }.  if( !zF
e160: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e170: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e180: 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75  e(&fd);.    retu
e190: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e1a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e1b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e1c0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
e1d0: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
e1e0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e1f0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
e200: 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  c;.  }.  nameLen
e210: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e220: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
e230: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
e240: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
e250: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
e260: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
e270: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
e280: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
e290: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e2a0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e2b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e2c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e2d0: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
e2e0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
e2f0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
e300: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
e310: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
e320: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
e330: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
e340: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
e350: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
e360: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
e370: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
e380: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e390: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
e3a0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
e3b0: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
e3c0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
e3d0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
e3e0: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
e3f0: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
e400: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
e410: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e420: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
e430: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
e440: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e450: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
e460: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
e470: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
e480: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
e490: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e4a0: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
e4b0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
e4c0: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
e4d0: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
e4e0: 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53  >fd = fd;.#if OS
e4f0: 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e  _UNIX.  pPager->
e500: 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67  fd.pPager = pPag
e510: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61  er;.#endif.  pPa
e520: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e530: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e540: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
e550: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
e560: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
e570: 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
e580: 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
e590: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e5a0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
e5b0: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
e5c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e5d0: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
e5e0: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
e5f0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
e600: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
e610: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
e620: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e630: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
e640: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
e650: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  0;.  pPager->nPa
e660: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
e670: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 0a  ->nMaxPage = 0;.
e680: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
e690: 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
e6a0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e6b0: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
e6c0: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
e6d0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e6e0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
e6f0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
e700: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
e710: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
e720: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
e730: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
e740: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
e750: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e760: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
e770: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
e780: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
e790: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
e7a0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
e7b0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
e7c0: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
e7d0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
e7e0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
e7f0: 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
e800: 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
e810: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
e820: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
e830: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
e840: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e850: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
e860: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
e870: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
e880: 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61  aHash));.  *ppPa
e890: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
e8a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e8b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e8c0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
e8d0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
e8e0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
e8f0: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
e900: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
e910: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
e920: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
e930: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e940: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
e950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e960: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
e970: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
e980: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
e990: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
e9a0: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
e9b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
e9c0: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
e9d0: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
e9e0: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
e9f0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
ea00: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
ea10: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
ea20: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
ea30: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
ea40: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
ea50: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
ea60: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
ea70: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
ea80: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
ea90: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
eaa0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
eab0: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
eac0: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
ead0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
eae0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
eaf0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
eb00: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
eb10: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
eb20: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
eb30: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
eb40: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
eb50: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
eb60: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
eb70: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
eb80: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
eb90: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
eba0: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
ebb0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
ebc0: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
ebd0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
ebe0: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
ebf0: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
ec00: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
ec10: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
ec20: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
ec30: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
ec40: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
ec50: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
ec60: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
ec70: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ec80: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
ec90: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
eca0: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
ecb0: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
ecc0: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
ecd0: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
ece0: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
ecf0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
ed00: 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
ed10: 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
ed20: 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
ed30: 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
ed40: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
ed50: 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
ed60: 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
ed70: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
ed80: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67  te3pager_set_pag
ed90: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
eda0: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
edb0: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
edc0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
edd0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
ede0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
edf0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
ee00: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
ee10: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
ee20: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  pageSize;.  }.  
ee30: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
ee40: 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
ee50: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
ee60: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
ee70: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
ee80: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
ee90: 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
eea0: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f  t points to.  No
eeb0: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
eec0: 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  is done..*/.void
eed0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
eee0: 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61  ad_fileheader(Pa
eef0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ef00: 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
ef10: 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d  r *pDest){.  mem
ef20: 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
ef30: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30  ;.  if( MEMDB==0
ef40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ef50: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
ef60: 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  d, 0);.    sqlit
ef70: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
ef80: 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b  ->fd, pDest, N);
ef90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
efa0: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
efb0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
efc0: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
efd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
efe0: 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a  ** pPager. .**.*
eff0: 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47  * If the PENDING
f000: 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68  _BYTE lies on th
f010: 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20  e page directly 
f020: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
f030: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68   the.** file, th
f040: 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  en consider this
f050: 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68   page part of th
f060: 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20  e file too. For 
f070: 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50  example, if.** P
f080: 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62  ENDING_BYTE is b
f090: 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69  yte 4096 (the fi
f0a0: 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65  rst byte of page
f0b0: 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65   5) and the size
f0c0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
f0d0: 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35  is 4096 bytes, 5
f0e0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
f0f0: 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e  tead of 4..*/.in
f100: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  t sqlite3pager_p
f110: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
f120: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
f130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f140: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
f150: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
f160: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67   ){.    n = pPag
f170: 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20  er->dbSize;.  } 
f180: 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73  else {.    if( s
f190: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f1a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e  (&pPager->fd, &n
f1b0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
f1c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
f1d0: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
f1e0: 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 20 20 72  RR_DISK;.      r
f1f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
f200: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
f210: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
f220: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
f230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f240: 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
f250: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
f260: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
f270: 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
f280: 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
f290: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
f2a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
f2b0: 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
f2c0: 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
f2d0: 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
f2e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
f2f0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
f300: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
f310: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
f320: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
f330: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
f340: 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
f350: 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
f360: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f370: 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
f380: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
f390: 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
f3a0: 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
f3b0: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
f3c0: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
f3d0: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  * sqlite3pager_m
f3e0: 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
f3f0: 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
f400: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
f410: 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
f420: 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
f430: 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
f440: 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
f450: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
f460: 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
f470: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
f480: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
f490: 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
f4a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
f4b0: 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c   number is zero,
f4c0: 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
f4d0: 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61  is not in any ha
f4e0: 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20  sh chain. */.   
f4f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
f500: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
f510: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
f520: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
f530: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
f540: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
f550: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
f560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f570: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
f580: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
f590: 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
f5a0: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
f5b0: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
f5c0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
f5d0: 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
f5e0: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
f5f0: 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
f600: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
f610: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  h]==pPg );.    p
f620: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
f630: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
f640: 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67  ;.  }..  pPg->pg
f650: 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
f660: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
f670: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
f680: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
f690: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
f6a0: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
f6b0: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
f6c0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
f6d0: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
f6e0: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
f6f0: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
f700: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
f710: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
f720: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
f730: 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
f740: 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
f750: 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
f760: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
f770: 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
f780: 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
f790: 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
f7a0: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
f7b0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
f7c0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
f7d0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
f7e0: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
f7f0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
f800: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
f810: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
f820: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
f830: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
f840: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
f850: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
f860: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
f870: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
f880: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
f890: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
f8a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
f8b0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
f8c0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
f8d0: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
f8e0: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
f8f0: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
f900: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
f910: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
f920: 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
f930: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f940: 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
f950: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
f960: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
f970: 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
f980: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
f990: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
f9a0: 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
f9b0: 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
f9c0: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
f9d0: 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
f9e0: 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
f9f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
fa00: 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
fa10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
fa20: 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
fa30: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
fa40: 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
fa50: 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
fa60: 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
fa70: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
fa80: 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
fa90: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
faa0: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
fab0: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
fac0: 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
fad0: 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
fae0: 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
faf0: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
fb00: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
fb10: 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
fb20: 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
fb30: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
fb40: 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
fb50: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
fb60: 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
fb70: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
fb80: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
fb90: 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
fba0: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
fbb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
fbc0: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
fbd0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
fbe0: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
fbf0: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
fc00: 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
fc10: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
fc20: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
fc30: 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
fc40: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
fc50: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
fc60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
fc70: 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
fc80: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
fc90: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
fca0: 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79  e.#define memory
fcb0: 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64  Truncate(p).#end
fcc0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  if../*.** Try to
fcd0: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
fce0: 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
fcf0: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
fd00: 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
fd10: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
fd20: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
fd30: 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
fd40: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
fd50: 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
fd60: 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
fd70: 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
fd80: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
fd90: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
fda0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
fdb0: 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
fdc0: 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
fde0: 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
fdf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
fe00: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
fe10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
fe20: 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
fe30: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
fe40: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
fe50: 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
fe60: 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
fe70: 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
fe80: 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
fe90: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
fea0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
feb0: 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
fec0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
fed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
fee0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
fef0: 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
ff00: 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
ff10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
ff20: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
ff30: 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73  sqlite3InvokeBus
ff40: 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d  yHandler(pPager-
ff50: 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29  >pBusyHandler) )
ff60: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
ff70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ff80: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
ff90: 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d   locktype;.    }
ffa0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
ffb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
ffc0: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
ffd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ffe0: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
fff0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10000 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
10010 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
10020 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
10030 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
10040 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
10050 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
10060 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
10070 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
10080 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
10090 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
100a0 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
100b0 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
100c0 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
100d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
100e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
100f0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
10100 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
10110 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
10120 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
10130 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10140 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
10150 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
10160 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10180 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
10190 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
101a0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
101b0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
101c0 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
101d0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
101e0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
101f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
10200 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10220 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
10230 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
10240 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
10250 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
10260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
10270 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10280 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
10290 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
102a0 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
102b0 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
102c0 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
102d0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
102e0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
102f0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
10300 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
10310 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10320 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
10330 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
10340 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
10350 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
10360 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
10370 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
10380 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
10390 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
103a0 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
103b0 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
103c0 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
103d0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
103e0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
103f0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
10400 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
10410 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
10420 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
10430 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10440 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69  g, *pNext;.  swi
10450 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
10460 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
10470 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20  AGER_RESERVED:. 
10480 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59     case PAGER_SY
10490 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20  NCED: .    case 
104a0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a  PAGER_EXCLUSIVE:
104b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 69   {.      /* We i
104c0 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72  gnore any IO err
104d0 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20 64  ors that occur d
104e0 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
104f0 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72  ck.      ** oper
10500 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c  ation. So disabl
10510 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c  e IO error simul
10520 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 65  ation so that te
10530 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77  sting.      ** w
10540 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c 79  orks more easily
10550 2e 0a 20 20 20 20 20 20 2a 2f 0a 23 69 66 20 64  ..      */.#if d
10560 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
10570 53 54 29 20 26 26 20 28 64 65 66 69 6e 65 64 28  ST) && (defined(
10580 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66 69  OS_UNIX) || defi
10590 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20 20  ned(OS_WIN)).   
105a0 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71     extern int sq
105b0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
105c0 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20 69 6e  ending;.      in
105d0 74 20 69 6f 65 72 72 5f 63 6e 74 20 3d 20 73 71  t ioerr_cnt = sq
105e0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
105f0 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20 73 71  ending;.      sq
10600 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
10610 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 23 65 6e  ending = -1;.#en
10620 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dif.      sqlite
10630 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
10640 70 50 61 67 65 72 29 3b 0a 23 69 66 20 64 65 66  pPager);.#if def
10650 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
10660 29 20 26 26 20 28 64 65 66 69 6e 65 64 28 4f 53  ) && (defined(OS
10670 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66 69 6e 65  _UNIX) || define
10680 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20 20 20 20  d(OS_WIN)).     
10690 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
106a0 72 5f 70 65 6e 64 69 6e 67 20 3d 20 69 6f 65 72  r_pending = ioer
106b0 72 5f 63 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20  r_cnt;.#endif.  
106c0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
106d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
106e0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
106f0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
10700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
10710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
10720 72 72 4d 61 73 6b 20 7c 7c 20 70 50 61 67 65 72  rrMask || pPager
10730 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
10740 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
10750 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
10760 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a  PAGER_SHARED: {.
10770 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
10780 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10790 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
107a0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
107b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
107c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
107d0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
107e0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
107f0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
10800 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
10810 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
10820 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
10830 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  t){.#ifndef NDEB
10840 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  UG.    if( MEMDB
10850 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
10860 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
10870 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
10880 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
10890 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
108a0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
108b0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
108c0 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
108d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
108e0 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
108f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e   }.#endif.    pN
10900 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
10910 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
10920 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
10930 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
10940 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
10950 67 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  ger));.  assert(
10960 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
10970 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75   || (pPager->jou
10980 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70  rnalOpen==0 && p
10990 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d  Pager->stmtOpen=
109a0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  =0) );.  if( pPa
109b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
109c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
109d0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
109e0 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  jfd);.  }.  sqli
109f0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
10a00 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  InJournal);.  if
10a10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
10a20 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
10a30 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
10a40 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73  ->stfd);.  }.  s
10a50 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
10a60 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a  Pager->fd);.  /*
10a70 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20   Temp files are 
10a80 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
10a90 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a  leted by the OS.
10aa0 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d    ** if( pPager-
10ab0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a  >tempFile ){.  *
10ac0 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  *   sqlite3OsDel
10ad0 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ete(pPager->zFil
10ae0 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20  ename);.  ** }. 
10af0 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 46 72 65   */..  sqliteFre
10b00 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
10b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10b20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
10b30 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
10b40 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
10b50 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
10b60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10b70 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44  enumber(void *pD
10b80 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
10b90 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
10ba0 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (pData);.  retur
10bb0 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  n p->pgno;.}../*
10bc0 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66  .** The page_ref
10bd0 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72  () function incr
10be0 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72  ements the refer
10bf0 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
10c00 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65   page..** If the
10c10 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
10c20 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
10c30 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63  st (the referenc
10c40 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29  e count is zero)
10c50 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20   then.** remove 
10c60 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  it from the free
10c70 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  list..**.** For 
10c80 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73  non-test systems
10c90 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20  , page_ref() is 
10ca0 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c  a macro that cal
10cb0 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a  ls _page_ref().*
10cc0 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20  * online of the 
10cd0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
10ce0 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65  is zero.  For te
10cf0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
10d00 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72  _ref().** is a r
10d10 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20  eal function so 
10d20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20  that we can set 
10d30 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20  breakpoints and 
10d40 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61  trace it..*/.sta
10d50 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72  tic void _page_r
10d60 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ef(PgHdr *pPg){.
10d70 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
10d80 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
10d90 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74   page is current
10da0 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  ly on the freeli
10db0 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20  st.  Remove it. 
10dc0 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  */.    if( pPg==
10dd0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
10de0 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
10df0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10e00 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10e10 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
10e20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
10e30 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
10e40 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
10e50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10e60 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20  ed = p;.    }.  
10e70 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10e80 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
10e90 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
10ea0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10eb0 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65  NextFree;.    }e
10ec0 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  lse{.      pPg->
10ed0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
10ee0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
10ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
10f00 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
10f10 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
10f20 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
10f30 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10f40 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
10f50 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
10f60 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
10f70 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  revFree;.    }. 
10f80 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
10f90 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50  nRef++;.  }.  pP
10fa0 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46  g->nRef++;.  REF
10fb0 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66  INFO(pPg);.}.#if
10fc0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10fd0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
10fe0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
10ff0 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  Pg){.    if( pPg
11000 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
11010 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67     _page_ref(pPg
11020 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
11030 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b      pPg->nRef++;
11040 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70  .      REFINFO(p
11050 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  Pg);.    }.  }.#
11060 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
11070 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
11080 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
11090 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
110a0 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
110b0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
110c0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
110d0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
110e0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
110f0 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
11100 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
11110 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
11120 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66  sqlite3pager_ref
11130 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
11140 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
11150 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
11160 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  a);.  page_ref(p
11170 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
11180 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11190 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
111a0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
111b0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
111c0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
111d0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
111e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
111f0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
11200 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
11210 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
11220 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
11230 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
11240 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
11250 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
11260 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
11270 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
11280 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
11290 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
112a0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
112b0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
112c0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
112d0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
112e0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
112f0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
11300 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
11310 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
11320 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
11330 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
11340 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
11350 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
11360 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
11370 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
11380 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
11390 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
113a0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
113b0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
113c0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
113d0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
113e0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
113f0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
11400 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
11410 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
11420 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
11430 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
11440 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
11450 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
11460 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
11470 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
11480 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
11490 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
114a0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
114b0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
114c0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
114d0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
114e0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
114f0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
11500 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
11510 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
11520 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
11530 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
11540 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
11550 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
11560 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
11570 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
11580 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
11590 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
115a0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
115b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
115c0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
115d0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
115e0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
115f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11600 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
11610 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
11620 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
11630 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
11640 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
11650 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
11660 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
11670 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
11680 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11690 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
116a0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
116b0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
116c0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
116d0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
116e0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
116f0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
11700 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
11710 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
11720 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
11730 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
11740 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
11750 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
11760 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
11770 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
11780 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
11790 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
117a0 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
117b0 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
117c0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
117d0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
117e0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
117f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
11800 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
11810 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  &pPager->jfd, &j
11820 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
11830 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
11840 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rc;.        asse
11850 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11860 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20  nalOff==jSz );. 
11870 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
11880 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
11890 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20   Write the nRec 
118a0 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a  value into the j
118b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64  ournal file head
118c0 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20  er. If in.      
118d0 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72    ** full-synchr
118e0 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63  onous mode, sync
118f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72   the journal fir
11900 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73  st. This ensures
11910 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
11920 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65   all data has re
11930 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73  ally hit the dis
11940 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73  k before nRec is
11950 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b   updated to mark
11960 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61  .        ** it a
11970 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
11980 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20  r rollback. .   
11990 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
119a0 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
119b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
119c0 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a    TRACE2("SYNC j
119d0 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
119e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
119f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
11a00 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
11a10 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
11a20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
11a30 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
11a40 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11a60 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
11a70 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20  >jfd,.          
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a90 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11aa0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
11ab0 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
11ac0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
11ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
11ae0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
11af0 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
11b00 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
11b10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
11b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20   return rc;..   
11b30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11b40 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
11b50 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11b60 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
11b70 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
11b80 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
11b90 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
11ba0 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
11bb0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11bc0 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  er));.      rc =
11bd0 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26   sqlite3OsSync(&
11be0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11bf0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
11c00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
11c10 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11c20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
11c30 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
11c40 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
11c50 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
11c60 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
11c70 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
11c80 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
11c90 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
11ca0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
11cb0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
11cc0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
11cd0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
11ce0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
11cf0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
11d00 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  d = pPager->pFir
11d10 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  st;.  }..#ifndef
11d20 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
11d30 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
11d40 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
11d50 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
11d60 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
11d70 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
11d80 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
11d90 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
11da0 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
11db0 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
11dc0 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
11dd0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
11de0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
11df0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
11e00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
11e10 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
11e20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
11e30 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
11e40 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d  tSynced==pPager-
11e50 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  >pFirst );.  }.#
11e60 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
11e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  rc;.}../*.** Giv
11e80 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
11e90 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
11ea0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
11eb0 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
11ec0 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
11ed0 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
11ee0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
11ef0 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
11f00 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
11f10 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
11f20 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
11f30 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
11f40 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
11f50 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
11f60 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
11f70 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
11f80 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
11f90 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
11fa0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
11fb0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
11fc0 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
11fd0 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
11fe0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
11ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
12000 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
12010 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
12020 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
12030 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
12040 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
12050 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
12060 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
12070 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
12080 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
12090 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
120a0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
120b0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
120c0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
120d0 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
120e0 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
120f0 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
12100 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
12110 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
12120 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
12130 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
12140 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
12150 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
12160 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
12170 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
12180 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
12190 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
121a0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
121b0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
121c0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
121d0 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
121e0 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
121f0 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
12200 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
12210 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
12220 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
12230 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
12240 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
12250 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
12260 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
12270 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12280 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
12290 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
122a0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
122b0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
122c0 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
122d0 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
122e0 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
122f0 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
12300 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
12310 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
12320 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
12330 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
12340 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
12350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12370 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ..  while( pList
12380 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12390 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
123a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
123b0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
123c0 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
123d0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
123e0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
123f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12400 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
12410 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
12420 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
12430 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
12440 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
12450 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
12460 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
12470 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
12480 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
12490 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
124a0 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
124b0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
124c0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
124d0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
124e0 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
124f0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
12500 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
12510 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
12520 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
12530 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f  Size ){.      CO
12540 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
12550 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
12560 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
12570 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
12580 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
12590 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
125a0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
125b0 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
125c0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
125d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
125e0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
125f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
12600 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ze);.      CODEC
12610 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
12620 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
12630 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  List->pgno, 0);.
12640 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28        TEST_INCR(
12650 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b  pPager->nWrite);
12660 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
12670 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
12680 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f        TRACE3("NO
12690 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
126a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
126b0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
126c0 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
126d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
126e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
126f0 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
12700 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
12710 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
12720 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
12730 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
12740 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
12750 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
12760 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
12770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12780 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
12790 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
127a0 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
127b0 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
127c0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
127d0 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
127e0 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
127f0 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
12800 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
12810 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
12820 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
12830 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
12840 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
12850 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
12860 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a  Hdr *p, *pList;.
12870 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66    pList = 0;.  f
12880 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
12890 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
128a0 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  All){.    if( p-
128b0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
128c0 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73  p->pDirty = pLis
128d0 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  t;.      pList =
128e0 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
128f0 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
12900 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
12910 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61  UE if there is a
12920 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
12930 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
12940 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
12950 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
12960 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
12970 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
12980 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
12990 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
129a0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
129b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
129c0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
129d0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
129e0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
129f0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
12a00 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
12a10 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
12a20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
12a30 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
12a40 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
12a50 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
12a60 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
12a70 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
12a80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12a90 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  ( !sqlite3OsFile
12aa0 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
12ab0 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74 75 72  Journal) ) retur
12ac0 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
12ad0 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
12ae0 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
12af0 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  d) ) return 0;. 
12b00 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
12b10 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
12b20 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
12b30 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
12b40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
12b50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
12b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
12b70 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
12b80 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
12b90 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
12ba0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
12bb0 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
12bc0 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
12bd0 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
12be0 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
12bf0 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
12c00 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
12c10 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
12c20 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
12c30 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
12c40 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
12c50 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
12c60 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
12c70 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
12c80 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
12c90 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
12ca0 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
12cb0 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
12cc0 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
12cd0 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
12ce0 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
12cf0 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
12d00 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
12d10 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
12d20 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
12d30 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
12d40 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
12d50 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
12d60 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
12d70 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
12d80 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
12d90 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
12da0 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
12db0 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
12dc0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
12dd0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
12de0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
12df0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
12e00 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
12e10 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  _lookup().  Both
12e20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
12e30 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65  d _lookup() atte
12e40 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
12e50 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
12e60 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
12e70 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
12e80 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
12e90 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
12ea0 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
12eb0 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
12ec0 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c  it in whereas _l
12ed0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
12ee0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
12ef0 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
12f00 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
12f10 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
12f20 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
12f30 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
12f40 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
12f50 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
12f60 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
12f70 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65  nce _lookup() ne
12f80 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ver goes to disk
12f90 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74  , it never has t
12fa0 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b  o deal with lock
12fb0 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  s.** or journal 
12fc0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
12fd0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 50  lite3pager_get(P
12fe0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
12ff0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a  no pgno, void **
13000 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  ppPage){.  PgHdr
13010 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
13020 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
13030 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
13040 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
13050 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
13060 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
13070 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
13080 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
13090 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
130a0 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
130b0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
130c0 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
130d0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
130e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
130f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
13100 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
13110 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
13120 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
13130 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
13140 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
13150 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
13160 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
13170 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
13180 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
13190 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
131a0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
131b0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
131c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
131d0 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
131e0 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
131f0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
13200 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
13210 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
13220 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
13230 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
13240 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  DB ){.    if( !p
13250 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
13260 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
13270 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
13280 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
13290 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
132a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
132b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
132c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
132d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
132e0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
132f0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
13300 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
13310 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
13320 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
13330 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
13340 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
13350 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
13360 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
13370 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  if( hasHotJourna
13380 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
13390 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
133a0 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
133b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
133c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
133d0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
133e0 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a   it is.       **
133f0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
13400 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13410 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
13420 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
13430 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  e.       ** EXCL
13440 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
13450 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
13460 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
13470 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  en the.       **
13480 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
13490 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
134a0 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
134b0 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
134c0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
134d0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
134e0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
134f0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
13500 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
13510 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
13520 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20    ** .       ** 
13530 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
13540 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
13550 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
13560 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
13570 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
13580 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
13590 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
135a0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
135b0 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f  l to.       ** o
135c0 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
135d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
135e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
135f0 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  le..       */.  
13600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13610 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
13620 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
13630 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28  OCK);.       if(
13640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13650 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
13660 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
13670 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
13680 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
13690 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
136a0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
136b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
136c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
136d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
136e0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
136f0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
13700 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
13710 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
13720 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
13730 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
13740 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
13750 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
13760 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
13770 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
13780 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
13790 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
137a0 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
137b0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
137c0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
137d0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
137e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
137f0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
13800 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
13810 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
13820 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
13830 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
13840 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
13850 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
13860 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
13870 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
13880 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
13890 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
138a0 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
138b0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
138c0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
138d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
138e0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
138f0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
13900 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
13910 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
13920 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13930 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
13940 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13950 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
13960 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13970 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
13980 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
13990 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
139a0 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
139b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
139c0 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
139d0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
139e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
139f0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a  ournalHdr = 0;..
13a00 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
13a10 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
13a20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
13a30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
13a40 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
13a50 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
13a60 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13a70 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13a80 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
13a90 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
13aa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13ab0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13ac0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ad0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13ae0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
13af0 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
13b00 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
13b10 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
13b20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13b30 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
13b40 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
13b50 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
13b60 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
13b70 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
13b80 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
13b90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13ba0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
13bb0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
13bc0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
13bd0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
13be0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
13bf0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
13c00 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
13c10 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
13c20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
13c30 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
13c40 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
13c50 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
13c60 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
13c70 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
13c80 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
13c90 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
13ca0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
13cd0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
13ce0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
13d10 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
13d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
13d30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
13d40 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
13d50 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b  = PAGER_ERR_MEM;
13d60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13d70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13d80 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
13d90 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
13da0 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
13db0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
13dc0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
13dd0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
13de0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
13df0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
13e00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
13e10 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
13e20 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
13e30 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
13e40 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
13e50 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
13e60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
13e70 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
13e80 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
13e90 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
13ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13eb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
13ec0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
13ed0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
13ee0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
13ef0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
13f00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13f10 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
13f20 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
13f30 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
13f40 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
13f50 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20       ** require 
13f60 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
13f70 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
13f80 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
13f90 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
13fa0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13fb0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
13fc0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
13fd0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13fe0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
13ff0 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ync().      ** o
14000 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
14010 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
14020 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
14030 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20   This is a.     
14040 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
14050 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
14060 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
14070 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
14080 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74  imes.      ** it
14090 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
140a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
140b0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
140c0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
140d0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
140e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
140f0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
14100 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
14110 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
14120 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14130 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14150 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14160 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
14170 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
14180 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
14190 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
141a0 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
141b0 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he..  ** journal
141c0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
141d0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
141e0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
141f0 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64  urnal..  ** head
14200 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
14210 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
14220 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
14230 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72  t have..  ** alr
14240 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
14250 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
14260 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
14270 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74  eader is..  ** t
14280 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
14290 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
142a0 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20  dated)..        
142b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
142c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
142d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
142e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
142f0 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
14300 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14310 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
14320 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
14330 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
14340 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14350 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14360 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
14370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14380 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
14390 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
143a0 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
143b0 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
143c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
143d0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
143e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
143f0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
14400 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14410 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
14420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14430 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
14440 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14450 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
14460 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
14470 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
14480 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14490 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
144a0 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
144b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
144c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
144d0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
144e0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
144f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14500 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
14530 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
14540 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
14550 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
14560 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
14570 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14580 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
14590 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
145a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
145b0 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
145c0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
145d0 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
145e0 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
145f0 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
14600 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
14610 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
14620 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
14630 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
14640 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
14650 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
14660 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
14670 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
14680 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
14690 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
146a0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
146b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
146c0 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
146d0 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
146e0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
146f0 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
14700 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
14710 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14720 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
14730 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
14740 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
14750 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
14760 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
14770 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
14780 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14790 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
147a0 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
147b0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
147c0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
147d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69     */.      unli
147e0 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
147f0 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
14800 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20 20  ger->nOvfl);.   
14810 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f   }.    pPg->pgno
14820 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28   = pgno;.    if(
14830 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
14840 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
14850 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
14860 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
14870 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
14880 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
14890 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
148a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
148b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
148c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
148d0 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
148e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
148f0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
14900 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
14910 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
14920 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
14930 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
14940 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
14950 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
14960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14970 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
14980 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
14990 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20  ager->stmtSize. 
149a0 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
149b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
149c0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
149d0 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20  gno&7)))!=0 ){. 
149e0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
149f0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
14a00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14a10 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72    page_remove_fr
14a20 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  om_stmt_list(pPg
14a30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  );.    }.    pPg
14a40 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
14a50 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
14a60 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
14a70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
14a80 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61  ef++;.    h = pa
14a90 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
14aa0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
14ab0 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
14ac0 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
14ad0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
14ae0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
14af0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
14b00 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
14b10 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
14b20 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
14b30 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
14b40 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
14b50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14b60 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
14b70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
14b80 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
14b90 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
14ba0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
14bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14bc0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
14bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
14be0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50  te3pager_unref(P
14bf0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
14c00 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  ));.      rc = p
14c10 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
14c20 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ger);.      retu
14c30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14c40 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67 65   if( sqlite3page
14c50 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
14c60 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b  er)<(int)pgno ){
14c70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
14c80 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14c90 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
14ca0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
14cb0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  e{.      int rc;
14cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
14cd0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20  EMDB==0 );.     
14ce0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
14cf0 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
14d00 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
14d10 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14d20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
14d30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14d50 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
14d60 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
14d70 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
14d80 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14d90 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33    }.      TRACE3
14da0 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20  ("FETCH %d page 
14db0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
14dc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
14dd0 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  o);.      CODEC(
14de0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
14df0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
14e00 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20  >pgno, 3);.     
14e10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14e20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  OK ){.        i6
14e30 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20  4 fileSize;.    
14e40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
14e50 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
14e60 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29  r->fd,&fileSize)
14e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
14e80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69             || fi
14e90 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61  leSize>=pgno*pPa
14ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
14eb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14ec0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
14ed0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14ee0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14f00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14f10 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
14f20 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
14f30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14f50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14f60 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
14f70 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20  r->nRead);.     
14f80 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20   }.    }.#ifdef 
14f90 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
14fa0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
14fb0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
14fc0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
14fd0 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
14fe0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
14ff0 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
15000 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
15010 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61     TEST_INCR(pPa
15020 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20  ger->nHit);.    
15030 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
15040 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50   }.  *ppPage = P
15050 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15060 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15070 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15080 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
15090 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
150a0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
150b0 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
150c0 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
150d0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
150e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
150f0 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
15100 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
15110 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
15120 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
15130 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
15140 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
15150 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
15160 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
15170 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
15180 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
15190 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
151a0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
151b0 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
151c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
151d0 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
151e0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
151f0 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
15200 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
15210 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
15220 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
15230 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
15240 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69  happened..*/.voi
15250 64 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  d *sqlite3pager_
15260 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
15270 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
15280 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
15290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
152a0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
152b0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69  ( pgno!=0 );.  i
152c0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
152d0 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52  sk & ~(PAGER_ERR
152e0 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65  _FULL) ){.    re
152f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
15300 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
15310 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
15320 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
15330 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
15340 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
15350 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
15360 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
15370 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
15380 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
15390 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
153a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
153b0 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
153c0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
153d0 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
153e0 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
153f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
15400 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
15410 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
15420 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
15430 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
15440 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
15450 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
15460 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
15470 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  f(void *pData){.
15480 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
15490 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
154a0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
154b0 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
154c0 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54    */.  pPg = DAT
154d0 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
154e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
154f0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
15500 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
15510 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
15520 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
15530 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
15540 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
15550 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
15560 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
15570 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
15580 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
15590 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
155a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
155b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
155c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
155d0 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
155e0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
155f0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
15600 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
15610 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
15620 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
15630 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
15640 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
15650 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
15660 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
15670 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
15680 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15690 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
156a0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
156b0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
156c0 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
156d0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
156e0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
156f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
15700 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
15710 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
15720 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
15730 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
15740 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65  tor(pData, pPage
15750 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
15760 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
15770 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
15780 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
15790 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
157a0 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
157b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
157c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
157d0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
157e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
157f0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
15800 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
15810 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  f==0 && !MEMDB )
15820 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  {.      pager_re
15830 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
15840 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15860 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
15870 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
15880 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
15890 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
158a0 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
158b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
158c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
158d0 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
158e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
158f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
15900 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
15910 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
15920 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
15930 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
15940 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
15950 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
15960 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15970 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
15980 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
15990 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
159a0 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
159b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
159c0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
159d0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
159e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
159f0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
15a00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15a10 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
15a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15a30 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
15a40 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
15a50 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
15a60 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
15a70 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
15a80 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
15a90 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
15aa0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15ab0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
15ac0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
15ad0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
15ae0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
15af0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
15b00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
15b10 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
15b20 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
15b30 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
15b40 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
15b50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15b60 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
15b70 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
15b80 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
15b90 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
15ba0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15bb0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  {.    goto faile
15bc0 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
15bd0 6c 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 46 55 4c  l;.  }.  SET_FUL
15be0 4c 53 59 4e 43 28 70 50 61 67 65 72 2d 3e 6a 66  LSYNC(pPager->jf
15bf0 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  d, pPager->fullS
15c00 79 6e 63 29 3b 0a 20 20 53 45 54 5f 46 55 4c 4c  ync);.  SET_FULL
15c10 53 59 4e 43 28 70 50 61 67 65 72 2d 3e 66 64 2c  SYNC(pPager->fd,
15c20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
15c30 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f  c);.  sqlite3OsO
15c40 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61  penDirectory(pPa
15c50 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
15c60 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
15c70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15c80 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
15c90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
15ca0 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
15cb0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
15cc0 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
15cd0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
15ce0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
15cf0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
15d00 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
15d10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
15d20 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
15d30 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
15d40 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
15d50 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
15d60 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
15d70 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
15d80 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
15d90 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
15da0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
15db0 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
15dc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
15de0 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61  r_stmt_begin(pPa
15df0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
15e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15e10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
15e20 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
15e30 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
15e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15e50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15e60 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
15e70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61    return rc;..fa
15e80 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
15e90 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72  rnal:.  sqliteFr
15ea0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
15eb0 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72  urnal);.  pPager
15ec0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
15ed0 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  ;.  sqlite3OsUnl
15ee0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
15ef0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
15f00 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
15f10 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74  ER_UNLOCK;.  ret
15f20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
15f30 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
15f40 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
15f50 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
15f60 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
15f70 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
15f80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
15f90 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
15fa0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
15fb0 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  mit() is called.
15fc0 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
15fd0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
15fe0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
15ff0 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
16000 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  _close() is call
16010 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
16020 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29  te3pager_unref()
16030 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
16040 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
16050 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
16060 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
16070 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
16080 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
16090 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
160a0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
160b0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
160c0 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
160d0 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
160e0 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
160f0 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
16100 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
16110 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
16120 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
16130 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
16140 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
16150 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
16160 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
16170 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
16180 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
16190 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
161a0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
161b0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
161c0 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
161d0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
161e0 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
161f0 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
16200 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
16210 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
16220 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
16230 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
16240 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
16250 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
16260 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
16270 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
16280 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
16290 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
162a0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
162b0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
162c0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
162d0 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
162e0 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
162f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16300 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
16310 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
16320 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
16330 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
16340 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
16350 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
16360 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
16370 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
16380 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
16390 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
163a0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
163b0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
163c0 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
163d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
163e0 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64  pager_begin(void
163f0 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46   *pData, int exF
16400 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  lag){.  PgHdr *p
16410 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
16420 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
16430 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
16440 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
16450 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16460 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
16470 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
16480 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
16490 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
164a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
164b0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
164c0 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
164d0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
164e0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
164f0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16500 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
16510 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
16520 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
16530 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
16540 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
16550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16560 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
16570 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
16580 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
16590 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
165a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
165b0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
165c0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
165d0 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
165e0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
165f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16600 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16610 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
16620 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
16630 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16650 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16660 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16670 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
16680 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ache = 0;.      
16690 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
166a0 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
166b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
166c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
166d0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
166e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
166f0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
16700 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
16710 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
16720 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
16730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16740 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70  ** Mark a data p
16750 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65  age as writeable
16760 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77  .  The page is w
16770 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
16780 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69  journal .** if i
16790 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61  t is not there a
167a0 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f  lready.  This ro
167b0 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61  utine must be ca
167c0 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69  lled before maki
167d0 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  ng.** changes to
167e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   a page..**.** T
167f0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
16800 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16810 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20  lled, the pager 
16820 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  creates a new.**
16830 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71   journal and acq
16840 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44  uires a RESERVED
16850 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16860 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52  abase.  If the R
16870 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20  ESERVED.** lock 
16880 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71  could not be acq
16890 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74  uired, this rout
168a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
168b0 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a  TE_BUSY.  The.**
168c0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
168d0 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20   must check for 
168e0 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75  that return valu
168f0 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c  e and be careful
16900 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67   not to.** chang
16910 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20  e any page data 
16920 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69  until this routi
16930 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
16940 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
16950 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
16960 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  could not be wri
16970 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65  tten because the
16980 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a   disk is full,.*
16990 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * then this rout
169a0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
169b0 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73  TE_FULL and does
169c0 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f   an immediate ro
169d0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73  llback..** All s
169e0 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20  ubsequent write 
169f0 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65  attempts also re
16a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
16a10 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20   until there.** 
16a20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  is a call to sql
16a30 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
16a40 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67  () or sqlite3pag
16a50 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f  er_rollback() to
16a60 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e  .** reset..*/.in
16a70 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  t sqlite3pager_w
16a80 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61  rite(void *pData
16a90 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
16aa0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
16ab0 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
16ac0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
16ad0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
16ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
16af0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
16b00 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
16b10 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29  Pager->errMask )
16b20 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  { .    return pa
16b30 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
16b40 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
16b50 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
16b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16b70 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
16b80 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
16b90 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
16ba0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
16bb0 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74  g);..  /* Mark t
16bc0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
16bd0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
16be0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
16bf0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
16c00 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
16c10 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
16c20 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
16c30 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
16c40 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
16c50 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e  ournal && (pPg->
16c60 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72  inStmt || pPager
16c70 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20  ->stmtInUse==0) 
16c80 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
16c90 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
16ca0 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20   }else{..    /* 
16cb0 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
16cc0 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ar, it means tha
16cd0 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  t the page needs
16ce0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72   to be.    ** wr
16cf0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61  itten to the tra
16d00 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
16d10 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69   or the ckeckpoi
16d20 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nt journal.    *
16d30 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a  * or both..    *
16d40 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63  *.    ** First c
16d50 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74  heck to see that
16d60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16d70 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
16d80 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  and.    ** creat
16d90 65 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20  e it if it does 
16da0 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  not..    */.    
16db0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16dc0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
16dd0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  OCK );.    rc = 
16de0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
16df0 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20  in(pData, 0);.  
16e00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16e10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16e20 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16e30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16e40 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
16e50 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
16e60 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
16e70 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
16e80 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
16e90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
16ea0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
16eb0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
16ec0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ed0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
16ee0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
16ef0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16f00 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
16f10 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
16f20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
16f30 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
16f40 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
16f50 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
16f60 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
16f70 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
16f80 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
16f90 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
16fa0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
16fb0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
16fc0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
16fd0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
16fe0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
16ff0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
17000 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
17010 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
17020 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
17030 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
17040 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
17050 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
17060 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
17070 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
17080 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
17090 0a 20 20 20 20 20 20 20 20 75 33 32 20 73 61 76  .        u32 sav
170a0 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ed;.        if( 
170b0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
170c0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
170d0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
170e0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
170f0 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
17100 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
17110 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
17120 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
17130 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
17140 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
17150 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
17160 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
17170 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  rig = sqliteMall
17180 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70  ocRaw( pPager->p
17190 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
171a0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
171b0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
171c0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
171d0 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f  t->pOrig, PGHDR_
171e0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
171f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
17200 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17210 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17220 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b        u32 cksum;
17230 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
17240 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
17250 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
17260 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
17270 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20   that.          
17280 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
17290 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20  database locks. 
172a0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
172b0 73 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20  ssert verifies. 
172c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
172d0 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
172e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
172f0 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45   pPg->pgno!=PAGE
17300 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
17310 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43  ) );.          C
17320 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
17330 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
17340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73  );.          cks
17350 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
17360 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67  (pPager, pPg->pg
17370 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20  no, pData);.    
17380 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
17390 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
173a0 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
173b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72  ;.          stor
173c0 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70  e32bits(cksum, p
173d0 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
173e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
173f0 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
17400 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
17410 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
17420 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
17430 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , -4);.         
17440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
17450 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
17460 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74  d, &((char*)pDat
17470 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20  a)[-4], szPg);. 
17480 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17490 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73  >journalOff += s
174a0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54  zPg;.          T
174b0 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE4("JOURNAL %
174c0 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
174d0 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
174e0 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
174f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17500 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
17510 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
17520 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
17530 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
17540 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
17550 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
17560 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
17570 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20  r) = saved;.    
17580 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
175a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
175b0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
175c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
175d0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
175e0 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
175f0 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ULL;.           
17600 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17620 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b    pPager->nRec++
17630 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17640 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17650 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
17660 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
17670 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
17680 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
17690 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
176a0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
176b0 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
176c0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
176d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
176e0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
176f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
17700 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
17710 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
17720 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
17730 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
17740 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
17750 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17760 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
17770 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  e{.        pPg->
17780 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
17790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
177a0 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e  ed && !pPager->n
177b0 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54  oSync;.        T
177c0 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
177d0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
177e0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
177f0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
17800 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17810 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
17820 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
17830 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
17840 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
17850 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17860 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
17870 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
17880 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
17890 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
178a0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
178b0 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
178c0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
178d0 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
178e0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
178f0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
17900 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
17910 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
17920 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
17930 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
17940 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
17950 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
17960 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
17970 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
17980 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
17990 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
179a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
179b0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
179c0 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
179d0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
179e0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
179f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
17a00 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
17a10 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
17a20 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
17a30 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
17a40 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
17a50 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
17a60 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
17a70 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
17a80 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
17a90 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
17aa0 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
17ab0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
17ac0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
17ad0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17ae0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
17af0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
17b00 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
17b10 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
17b20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
17b30 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
17b40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
17b50 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
17b60 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
17b70 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
17b80 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
17b90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
17ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
17bb0 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
17bc0 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
17bd0 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
17be0 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
17bf0 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
17c00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17c10 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
17c20 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44  >stfd,((char*)pD
17c30 61 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e  ata)-4, pPager->
17c40 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
17c50 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
17c60 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
17c70 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17c80 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17c90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f  gno);.        CO
17ca0 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
17cb0 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
17cc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17cd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17cf0 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
17d00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17d10 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
17d20 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46  k |= PAGER_ERR_F
17d30 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ULL;.          r
17d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17d50 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
17d60 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
17d70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17d80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
17d90 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
17da0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
17db0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
17dc0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
17dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
17de0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
17df0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
17e00 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
17e10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
17e20 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
17e30 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
17e40 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50  ->dbSize<(int)pP
17e50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  g->pgno ){.    p
17e60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17e70 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69  pPg->pgno;.    i
17e80 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  f( !MEMDB && pPa
17e90 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e  ger->dbSize==PEN
17ea0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
17eb0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
17ec0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
17ed0 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ze++;.    }.  }.
17ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ef0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
17f00 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
17f10 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
17f20 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
17f30 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
17f40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
17f50 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20  te().  In other 
17f60 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
17f70 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a  UE if it is ok.*
17f80 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20  * to change the 
17f90 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
17fa0 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  age..*/.int sqli
17fb0 74 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65  te3pager_iswrite
17fc0 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61  able(void *pData
17fd0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
17fe0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
17ff0 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  pData);.  return
18000 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a   pPg->dirty;.}..
18010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18020 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  MIT_VACUUM./*.**
18030 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
18040 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
18050 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
18060 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
18070 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
18080 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
18090 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69  te3pager_overwri
180a0 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
180b0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
180c0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69  d *pData){.  voi
180d0 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  d *pPage;.  int 
180e0 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
180f0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
18100 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  ger, pgno, &pPag
18110 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
18120 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
18130 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
18140 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
18150 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
18170 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74  mcpy(pPage, pDat
18180 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
18190 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
181a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
181b0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
181c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
181d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
181e0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
181f0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
18200 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
18210 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
18220 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
18230 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
18240 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74  "pgno" back to t
18250 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68  he disk, even th
18260 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67  ough.** that pag
18270 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65  e might be marke
18280 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a  d as dirty..**.*
18290 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20  * The overlying 
182a0 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63  software layer c
182b0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
182c0 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68  e when all of th
182d0 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65  e data.** on the
182e0 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75   given page is u
182f0 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65  nused.  The page
18300 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65  r marks the page
18310 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20   as clean so.** 
18320 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74  that it does not
18330 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20   get written to 
18340 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  disk..**.** Test
18350 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73  s show that this
18360 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74   optimization, t
18370 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65  ogether with the
18380 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
18390 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29  _dont_rollback()
183a0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
183b0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
183c0 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
183d0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
183e0 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
183f0 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
18400 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
18410 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
18420 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
18430 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
18440 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
18450 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
18460 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
18470 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
18480 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
18490 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
184a0 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
184b0 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
184c0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
184d0 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
184e0 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
184f0 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
18500 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
18510 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
18520 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
18530 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
18540 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
18550 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
18560 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
18570 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
18580 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
18590 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
185a0 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
185b0 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
185c0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
185d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
185e0 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
185f0 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64  reused,.** the d
18600 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72  ont_rollback() r
18610 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18620 2e 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74  .  But because t
18630 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  he page contains
18640 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74  .** critical dat
18650 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64  a, we still need
18660 20 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67   to be sure it g
18670 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ets rolled back 
18680 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74  in spite.** of t
18690 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  he dont_rollback
186a0 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
186b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
186c0 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a  nt_write(Pager *
186d0 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
186e0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
186f0 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  ;..  if( MEMDB )
18700 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20   return;..  pPg 
18710 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
18720 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
18730 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
18740 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  ack = 1;.  if( p
18750 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79  Pg && pPg->dirty
18760 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
18770 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66  tInUse ){.    if
18780 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18790 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
187a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
187b0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
187c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
187d0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
187e0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
187f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
18800 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
18810 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
18820 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
18830 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
18840 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
18850 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
18860 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
18870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18880 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
18890 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
188a0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
188b0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
188c0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
188d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
188e0 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
188f0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
18900 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
18910 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
18920 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
18930 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
18940 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
18950 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
18960 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
18970 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
18980 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
18990 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
189a0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
189b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
189c0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
189d0 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
189e0 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
189f0 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50  f %d\n", pgno, P
18a00 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
18a10 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
18a20 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  y = 0;.#ifdef SQ
18a30 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
18a40 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
18a50 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
18a60 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
18a70 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
18a80 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
18a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
18aa0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
18ab0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
18ac0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
18ad0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
18ae0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
18af0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
18b00 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
18b10 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
18b20 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
18b30 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
18b40 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
18b50 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
18b60 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73  urnal..*/.void s
18b70 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
18b80 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  _rollback(void *
18b90 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
18ba0 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
18bb0 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
18bc0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18bd0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69  Pg->pPager;..  i
18be0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18bf0 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  !=PAGER_EXCLUSIV
18c00 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  E || pPager->jou
18c10 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
18c20 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
18c30 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
18c40 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
18c50 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
18c60 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
18c70 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
18c80 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
18c90 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
18ca0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
18cb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18cc0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
18cd0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
18ce0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
18cf0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
18d00 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
18d10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
18d20 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
18d30 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
18d40 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
18d50 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
18d60 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
18d70 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70  pgno&7);.      p
18d80 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
18d90 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
18da0 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e  .    TRACE3("DON
18db0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
18dc0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
18dd0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
18de0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
18df0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
18e00 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69  InUse && !pPg->i
18e10 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50  nStmt && (int)pP
18e20 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  g->pgno<=pPager-
18e30 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20  >stmtSize ){.   
18e40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
18e50 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
18e60 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
18e70 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
18e80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18e90 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
18ea0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
18eb0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
18ec0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
18ed0 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65  gno&7);.    page
18ee0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
18ef0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  t(pPg);.  }.}...
18f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18f10 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
18f20 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
18f30 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
18f40 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
18f50 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
18f60 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
18f70 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
18f80 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
18f90 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
18fa0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
18fb0 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
18fc0 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73  Stmt = 0;.}.#els
18fd0 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48  e.#define clearH
18fe0 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66  istory(x).#endif
18ff0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
19000 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
19010 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
19020 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
19030 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
19040 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
19050 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
19060 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
19070 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
19080 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
19090 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
190a0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
190b0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
190c0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
190d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
190e0 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  er_commit(Pager 
190f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
19100 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
19110 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
19120 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f  >errMask==PAGER_
19130 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
19140 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19150 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
19160 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
19170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19180 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
19190 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ULL;.    }.    r
191a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
191b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
191c0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
191d0 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
191e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
191f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
19200 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
19210 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
19220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19230 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
19240 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54    TRACE2("COMMIT
19250 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19260 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
19270 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
19280 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
19290 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
192a0 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
192b0 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
192c0 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
192d0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
192e0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
192f0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
19300 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
19310 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
19320 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
19330 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
19340 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
19350 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
19360 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  pPg = pPg->pDirt
19370 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  y;.    }.#ifndef
19380 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
19390 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
193a0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
193b0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
193c0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
193d0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
193e0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
193f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
19400 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
19410 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
19420 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
19430 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
19440 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
19450 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
19460 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
19470 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
19480 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
19490 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
194a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
194b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
194c0 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
194d0 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
194e0 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
194f0 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
19500 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
19510 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
19520 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
19530 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
19540 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19550 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
19560 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19570 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
19580 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
19590 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
195a0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
195b0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
195c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
195d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
195e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
195f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
19600 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c  ger_sync(pPager,
19610 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
19620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19630 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61     goto commit_a
19640 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  bort;.  }.  rc =
19650 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
19660 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  ck(pPager);.  pP
19670 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19680 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
19690 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
196a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
196b0 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68   wrong during th
196c0 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
196d0 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62  ..  */.commit_ab
196e0 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61  ort:.  sqlite3pa
196f0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
19700 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
19710 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
19720 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
19730 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  .  The database 
19740 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41  falls back to PA
19750 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e  GER_SHARED mode.
19760 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72  .** All in-memor
19770 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65  y cache pages re
19780 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72  vert to their or
19790 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74  iginal data cont
197a0 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75  ents..** The jou
197b0 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e  rnal is deleted.
197c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
197d0 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ine cannot fail 
197e0 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
197f0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
19800 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68   following.** th
19810 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e  e correct lockin
19820 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49  g protocol (SQLI
19830 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20  TE_PROTOCOL) or 
19840 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
19850 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
19860 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
19870 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
19880 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
19890 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
198a0 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
198b0 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
198c0 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
198d0 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
198e0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
198f0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
19900 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
19910 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
19920 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
19930 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19940 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50  pager_rollback(P
19950 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19960 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45   int rc;.  TRACE
19970 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
19980 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19990 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
199a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
199b0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
199c0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
199d0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
199e0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
199f0 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
19a00 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
19a10 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
19a20 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
19a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19a40 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
19a50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
19a60 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
19a70 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19a80 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
19a90 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
19aa0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
19ab0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
19ac0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
19ad0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
19ae0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
19af0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19b00 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
19b10 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
19b20 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
19b30 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
19b40 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19b50 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ze);.        TRA
19b60 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
19b70 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
19b80 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
19b90 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
19ba0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19bb0 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
19bc0 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
19bd0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
19be0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
19bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
19c00 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
19c10 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
19c20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
19c30 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
19c40 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30     p->inStmt = 0
19c50 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76  ;.      p->pPrev
19c60 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53  Stmt = p->pNextS
19c70 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  tmt = 0;..      
19c80 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
19c90 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
19ca0 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
19cb0 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  er(PGHDR_TO_DATA
19cc0 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  (p), pPager->pag
19cd0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
19ce0 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20        .    }.   
19cf0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
19d00 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19d10 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
19d20 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20  >origDbSize;.   
19d30 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
19d40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
19d50 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
19d60 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19d70 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
19d80 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
19d90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19da0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
19db0 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70  dirtyCache || !p
19dc0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
19dd0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  en ){.    rc = p
19de0 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
19df0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
19e00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
19e10 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
19e20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
19e30 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
19e40 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  && pPager->errMa
19e50 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55  sk!=PAGER_ERR_FU
19e60 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  LL ){.    if( pP
19e70 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
19e80 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
19e90 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79        pager_play
19ea0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19eb0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70    }.    return p
19ec0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
19ed0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
19ee0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
19ef0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
19f00 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
19f10 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c    rc = pager_rel
19f20 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
19f30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
19f40 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
19f50 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19f70 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
19f80 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19f90 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
19fa0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
19fb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19fd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
19fe0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50  UPT_BKPT;.    pP
19ff0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
1a000 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
1a010 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
1a020 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
1a030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a040 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1a050 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1a060 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1a070 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
1a080 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
1a090 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
1a0a0 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
1a0b0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
1a0c0 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f  te3pager_isreado
1a0d0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
1a0e0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1a0f0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
1a100 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a110 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
1a120 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
1a130 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
1a140 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  nt *sqlite3pager
1a150 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
1a160 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
1a170 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
1a180 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
1a190 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
1a1a0 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
1a1b0 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
1a1c0 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
1a1d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
1a1e0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
1a1f0 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
1a200 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23 69  ger->errMask;.#i
1a210 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1a220 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
1a230 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
1a240 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
1a250 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d    a[8] = pPager-
1a260 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d  >nOvfl;.  a[9] =
1a270 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a   pPager->nRead;.
1a280 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72    a[10] = pPager
1a290 2d 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66  ->nWrite;.#endif
1a2a0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a  .  return a;.}..
1a2b0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
1a2c0 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
1a2d0 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
1a2e0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
1a2f0 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
1a300 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a310 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
1a320 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
1a330 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a340 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
1a350 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
1a360 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
1a370 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
1a380 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
1a390 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
1a3a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
1a3b0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
1a3c0 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  tmt_begin(Pager 
1a3d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1a3e0 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
1a3f0 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
1a400 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
1a410 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
1a420 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
1a430 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a440 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28  >=0 );.  TRACE2(
1a450 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
1a460 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1a470 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1a480 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a490 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1a4a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
1a4b0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a4c0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
1a4d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1a4e0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1a4f0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1a500 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1a510 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
1a520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a530 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a550 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
1a560 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
1a570 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
1a580 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1a590 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1a5a0 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
1a5b0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
1a5c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
1a5d0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65  ED_LOCK);.    re
1a5e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1a5f0 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
1a600 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
1a610 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
1a620 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1a630 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
1a640 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
1a650 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1a660 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
1a670 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1a680 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
1a690 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
1a6a0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
1a6b0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
1a6c0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
1a6d0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
1a6e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1a6f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
1a700 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
1a710 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
1a720 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
1a730 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
1a740 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
1a750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1a760 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
1a770 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  mp, &pPager->stf
1a780 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
1a790 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
1a7a0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
1a7b0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
1a7c0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
1a7d0 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
1a7e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
1a7f0 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
1a800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
1a810 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
1a820 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
1a830 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
1a840 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
1a850 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
1a860 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1a870 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1a880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a890 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
1a8a0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1a8b0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
1a8c0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1a8d0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
1a8e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1a8f0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
1a900 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45  pNext;.    TRACE
1a910 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
1a920 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1a930 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
1a940 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
1a950 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
1a960 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
1a970 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
1a980 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
1a990 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
1a9a0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
1a9b0 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
1a9c0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
1a9d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1a9e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1a9f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
1aa00 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
1aa10 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
1aa20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
1aa30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1aa40 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
1aa50 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
1aa60 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1aa70 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1aa80 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1aa90 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1aaa0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1aab0 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1aac0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1aad0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1aae0 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
1aaf0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
1ab00 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1ab10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
1ab20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
1ab30 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
1ab40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1ab50 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1ab60 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
1ab70 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1ab80 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1ab90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1aba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
1abb0 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
1abc0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1abd0 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
1abe0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
1abf0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1ac00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ac10 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
1ac20 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
1ac30 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
1ac40 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1ac50 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1ac60 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
1ac70 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
1ac80 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
1ac90 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
1aca0 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
1acb0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1acc0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1acd0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1ace0 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1acf0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1ad00 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1ad10 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1ad20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
1ad30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1ad40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1ad50 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
1ad60 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
1ad70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
1ad80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ad90 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
1ada0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
1adb0 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
1adc0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
1add0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1ade0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1adf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ae00 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
1ae10 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1ae20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1ae30 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
1ae40 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
1ae50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1ae60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ae70 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1ae80 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
1ae90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1aea0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
1aeb0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
1aec0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1aed0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1aee0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
1aef0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
1af00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1af10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1af20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1af30 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
1af40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1af50 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1af60 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
1af70 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
1af80 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1af90 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
1afa0 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
1afb0 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
1afc0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
1afd0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
1afe0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1aff0 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
1b000 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
1b010 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1b020 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
1b030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b040 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29   true if fsync()
1b050 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62   calls are disab
1b060 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67  led for this pag
1b070 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  er.  Return FALS
1b080 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73  E.** if fsync()s
1b090 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f   are executed no
1b0a0 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73  rmally..*/.int s
1b0b0 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73 79  qlite3pager_nosy
1b0c0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1b0d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1b0e0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f  er->noSync;.}../
1b0f0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
1b100 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
1b110 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
1b120 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65 63  3pager_set_codec
1b130 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
1b140 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64  r,.  void (*xCod
1b150 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
1b160 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
1b170 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
1b180 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
1b190 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
1b1a0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
1b1b0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
1b1c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b1d0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1b1e0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1b1f0 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1b200 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1b210 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1b220 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1b230 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b240 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1b250 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1b260 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69 64  *pPager){.  void
1b270 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64 72   *pPage;.  PgHdr
1b280 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20   *pPgHdr;.  u32 
1b290 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1b2a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1b2b0 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74  Open page 1 of t
1b2c0 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74  he file for writ
1b2d0 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ing. */.  rc = s
1b2e0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1b2f0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67  pPager, 1, &pPag
1b300 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
1b310 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1b320 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
1b330 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70  te3pager_write(p
1b340 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1b350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1b360 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65  urn rc;..  /* Re
1b370 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ad the current v
1b380 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e  alue at byte 24.
1b390 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20 44   */.  pPgHdr = D
1b3a0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50 61  ATA_TO_PGHDR(pPa
1b3b0 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f  ge);.  change_co
1b3c0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1b3d0 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1b3e0 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d  4);..  /* Increm
1b3f0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1b400 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1b410 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1b420 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67  e 24. */.  chang
1b430 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73  e_counter++;.  s
1b440 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e 67  tore32bits(chang
1b450 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48 64  e_counter, pPgHd
1b460 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65  r, 24);..  /* Re
1b470 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
1b480 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73  eference. */.  s
1b490 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1b4a0 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  f(pPage);.  retu
1b4b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b4c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
1b4d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1b4e0 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67  r the pager pPag
1b4f0 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  er. zMaster poin
1b500 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a  ts to the name.*
1b510 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * of a master jo
1b520 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
1b530 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
1b540 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76  n into the indiv
1b550 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  idual.** journal
1b560 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d   file. zMaster m
1b570 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63  ay be NULL, whic
1b580 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  h is interpreted
1b590 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   as no master.**
1b5a0 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67   journal (a sing
1b5b0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1b5c0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1b5d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
1b5e0 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f  ures that the jo
1b5f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c  urnal is synced,
1b600 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1b610 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74   written.** to t
1b620 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b630 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
1b640 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54  e file synced. T
1b650 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68  he only thing th
1b660 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f  at.** remains to
1b670 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e   commit the tran
1b680 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65  saction is to de
1b690 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1b6a0 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73   file (or.** mas
1b6b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b6c0 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a   if specified)..
1b6d0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1b6e0 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c  if zMaster==NULL
1b6f0 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20  , this does not 
1b700 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76  overwrite a prev
1b710 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61  ious value.** pa
1b720 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74  ssed to an sqlit
1b730 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20 63  e3pager_sync() c
1b740 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
1b750 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
1b760 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1b770 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
1b780 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
1b790 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
1b7a0 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
1b7b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1b7c0 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20  abases)..*/.int 
1b7d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
1b7e0 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  c(Pager *pPager,
1b7f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1b800 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
1b810 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
1b820 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41  QLITE_OK;..  TRA
1b830 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
1b840 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
1b850 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
1b860 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
1b870 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1b880 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
1b890 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1b8a0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1b8b0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
1b8c0 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1b8d0 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
1b8e0 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
1b8f0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1b900 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
1b910 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
1b920 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1b930 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
1b940 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1b950 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
1b960 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
1b970 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b980 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1b990 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
1b9a0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b9b0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
1b9c0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1b9d0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
1b9e0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
1b9f0 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
1ba00 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
1ba10 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
1ba20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
1ba30 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
1ba40 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
1ba50 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
1ba60 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
1ba70 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
1ba80 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
1ba90 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
1baa0 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
1bab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1bac0 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
1bad0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1bae0 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
1baf0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1bb00 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
1bb10 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1bb20 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1bb30 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1bb40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bb50 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1bb60 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
1bb70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1bb80 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
1bb90 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1bba0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
1bbb0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
1bbc0 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
1bbd0 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
1bbe0 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
1bbf0 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
1bc00 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
1bc10 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
1bc20 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1bc30 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1bc40 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1bc50 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
1bc60 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70  .        void *p
1bc70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Page;.        in
1bc80 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
1bc90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
1bca0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
1bcb0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1bcc0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1bcd0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1bce0 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
1bcf0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
1bd00 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26  & (1<<(i&7))) &&
1bd10 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
1bd20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1bd30 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1bd40 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
1bd50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1bd60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bd70 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1bd80 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1bd90 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1bda0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1bdb0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1bdc0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1bdd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1bde0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bdf0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1be00 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1be10 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
1be20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1be30 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
1be40 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1be50 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1be60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1be70 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1be80 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
1be90 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1bea0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1beb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1bec0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1bed0 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
1bee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1bef0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1bf00 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1bf10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1bf20 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1bf30 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
1bf40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bf50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1bf60 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
1bf70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
1bf80 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
1bf90 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1bfa0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
1bfb0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1bfc0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1bfd0 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
1bfe0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1bff0 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
1c000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c010 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1c020 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
1c030 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c040 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1c050 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1c060 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c070 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
1c080 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1c090 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1c0a0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1c0b0 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
1c0c0 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1c0d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1c0e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1c0f0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1c100 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1c110 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1c120 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1c130 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1c140 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1c150 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1c160 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c170 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1c180 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1c190 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1c1a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1c1b0 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1c1c0 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1c1d0 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1c1e0 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1c1f0 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1c200 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1c210 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1c220 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1c230 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1c240 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1c250 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1c260 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1c270 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1c280 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1c290 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1c2a0 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1c2b0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1c2c0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1c2d0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1c2e0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1c2f0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1c300 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1c310 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1c320 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1c330 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1c340 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1c350 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1c360 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1c370 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1c380 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1c390 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1c3a0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1c3b0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1c3c0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1c3d0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1c3e0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1c3f0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1c400 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1c410 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1c420 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1c430 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1c440 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1c450 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1c460 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1c470 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1c480 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1c490 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1c4a0 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1c4b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1c4c0 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1c4d0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1c4e0 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1c4f0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1c500 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1c510 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1c520 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1c530 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  , pgno);..  if( 
1c540 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1c550 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
1c560 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
1c570 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1c580 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1c590 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1c5a0 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
1c5b0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1c5c0 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
1c5d0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
1c5e0 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
1c5f0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
1c600 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1c610 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
1c620 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
1c630 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
1c640 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
1c650 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
1c660 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
1c670 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
1c680 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
1c690 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
1c6a0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
1c6b0 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
1c6c0 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
1c6d0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
1c6e0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
1c6f0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
1c700 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
1c710 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1c720 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1c730 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
1c740 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1c750 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
1c760 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1c770 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
1c780 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74      pPgOld->dirt
1c790 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1c7a0 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
1c7b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1c7c0 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
1c7d0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
1c7e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1c7f0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1c800 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
1c810 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c820 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
1c830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
1c840 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
1c850 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
1c860 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
1c870 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
1c880 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   */.  pPg->pgno 
1c890 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61  = pgno;.  h = pa
1c8a0 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
1c8b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1c8c0 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1c8d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1c8e0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1c8f0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1c900 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1c910 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1c920 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1c930 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1c940 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1c950 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1c960 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1c970 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e  sh = 0;..  pPg->
1c980 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61  dirty = 1;.  pPa
1c990 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c9a0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1c9b0 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1c9c0 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1c9d0 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1c9e0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1c9f0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1ca00 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1ca10 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1ca20 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1ca30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1ca40 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1ca50 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1ca60 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1ca70 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1ca80 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1ca90 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
1caa0 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
1cab0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
1cac0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
1cad0 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
1cae0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
1caf0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
1cb00 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
1cb10 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1cb20 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
1cb30 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
1cb40 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
1cb50 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
1cb60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
1cb70 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
1cb80 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
1cb90 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1cba0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
1cbb0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
1cbc0 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
1cbd0 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
1cbe0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1cbf0 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
1cc00 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1cc10 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
1cc20 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
1cc30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1cc40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1cc50 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
1cc60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1cc70 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1cc80 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
1cc90 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1cca0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1ccb0 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
1ccc0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  al = 1;.    DATA
1ccd0 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1cce0 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b  ync)->dirty = 1;
1ccf0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1cd00 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
1cd10 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1cd20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1cd30 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1cd40 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1cd50 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1cd60 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1cd70 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1cd80 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
1cd90 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
1cda0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1cdb0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1cdc0 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
1cdd0 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
1cde0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
1cdf0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
1ce00 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
1ce10 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
1ce20 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
1ce30 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1ce40 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53  ){.#ifdef OS_TES
1ce50 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  T.  return pPage
1ce60 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79  r->fd->fd.lockty
1ce70 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  pe;.#else.  retu
1ce80 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f  rn pPager->fd.lo
1ce90 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d  cktype;.#endif.}
1cea0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1ceb0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1cec0 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69  ** Print a listi
1ced0 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65  ng of all refere
1cee0 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74  nced pages and t
1cef0 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a  heir ref count..
1cf00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
1cf10 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67  ager_refdump(Pag
1cf20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1cf30 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
1cf40 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1cf50 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1cf60 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1cf70 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
1cf80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1cf90 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
1cfa0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
1cfb0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
1cfc0 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
1cfd0 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
1cfe0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
1cff0 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
1d000 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
1d010 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
1d020 2a 2f 0a                                         */.