/ Hex Artifact Content
Login

Artifact 942cbb9d1de5e198d26979f992eba1b4e527ac08:


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 31 37  : pager.c,v 1.17
0350: 35 20 32 30 30 34 2f 31 31 2f 30 38 20 30 37 3a  5 2004/11/08 07:
0360: 31 33 3a 31 34 20 64 61 6e 69 65 6c 6b 31 39 37  13:14 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 20 56 29 0a 23 65 6c 73 65  ,Y,Z,W, V).#else
0520: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0530: 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  X).#define TRACE
0540: 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54  2(X,Y).#define T
0550: 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65  RACE3(X,Y,Z).#de
0560: 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c  fine TRACE4(X,Y,
0570: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0580: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23  CE5(X,Y,Z,W,V).#
0590: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
05a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d   following two m
05b0: 61 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77  acros are used w
05c0: 69 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58  ithin the TRACEX
05d0: 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a  () macros above.
05e0: 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20  ** to print out 
05f0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73  file-descriptors
0600: 2e 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69  . They are requi
0610: 72 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63  red so that trac
0620: 69 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75  ing.** can be tu
0630: 72 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69  rned on when usi
0640: 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75  ng both the regu
0650: 6c 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e  lar os_unix.c an
0660: 64 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62  d os_test.c.** b
0670: 61 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50  ackends..**.** P
0680: 41 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61  AGERID() takes a
0690: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
06a0: 67 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74  ger struct as it
06b0: 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  's argument. The
06c0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66  .** associated f
06d0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69  ile-descriptor i
06e0: 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45  s returned. FILE
06f0: 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73  HANDLEID() takes
0700: 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74   an OsFile.** st
0710: 72 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67  ruct as it's arg
0720: 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66  ument..*/.#ifdef
0730: 20 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65   OS_TEST.#define
0740: 20 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e   PAGERID(p) (p->
0750: 66 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e  fd->fd.h).#defin
0760: 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  e FILEHANDLEID(f
0770: 64 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65  d) (fd->fd.h).#e
0780: 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45  lse.#define PAGE
0790: 52 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29  RID(p) (p->fd.h)
07a0: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
07b0: 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29  DLEID(fd) (fd.h)
07c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
07d0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73  he page cache as
07e0: 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61   a whole is alwa
07f0: 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ys in one of the
0800: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
0810: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41  ates:.**.**   PA
0820: 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20  GER_UNLOCK      
0830: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0840: 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
0850: 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a  y reading or .**
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74         writing t
0880: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0890: 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a  .  There is no.*
08a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
08b0: 20 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c          data hel
08c0: 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68  d in memory.  Th
08d0: 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
08e0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0900: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0910: 53 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68  SHARED        Th
0920: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0930: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0940: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
0960: 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65  riting is not pe
0970: 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20  rmitted.  There 
0980: 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  can be.**       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
09b0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
09c0: 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ame database.** 
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68        file at th
09f0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a  e same time..**.
0a00: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
0a10: 56 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72  VED      This pr
0a20: 6f 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76  ocess has reserv
0a30: 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
0a40: 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20  for writing.**  
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74       but has not
0a70: 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68   yet made any ch
0a80: 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65  anges.  Only one
0a90: 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20   process.**     
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20    at a time can 
0ac0: 72 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61  reserve the data
0ad0: 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69  base.  The origi
0ae0: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0b00: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
0b10: 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  ot been modified
0b20: 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20   so other.**    
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79     processes may
0b50: 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e   still be readin
0b60: 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a  g the on-disk.**
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0b90: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41  file..**.**   PA
0ba0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20  GER_EXCLUSIVE   
0bb0: 20 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65    The page cache
0bc0: 20 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20   is writing the 
0bd0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20  database..**    
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63     Access is exc
0c00: 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65  lusive.  No othe
0c10: 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a  r processes or.*
0c20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0c30: 20 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20          threads 
0c40: 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f  can be reading o
0c50: 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20  r writing while 
0c60: 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  one.**          
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0c80: 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e  cess is writing.
0c90: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0ca0: 59 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65  YNCED        The
0cb0: 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20   pager moves to 
0cc0: 74 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20  this state from 
0cd0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a  PAGER_EXCLUSIVE.
0ce0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0cf0: 20 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61           after a
0d00: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68  ll dirty pages h
0d10: 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
0d20: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0d50: 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
0d60: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a  been synced to.*
0d70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d80: 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c          disk. Al
0d90: 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74  l that remains t
0da0: 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76  o do is to remov
0db0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  e the.**        
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a                 j
0dd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20  ournal file and 
0de0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0df0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20  will be.**      
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
0e20: 2a 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65  * The page cache
0e30: 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47   comes up in PAG
0e40: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0e50: 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20  first time a.** 
0e60: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
0e70: 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73  () occurs, the s
0e80: 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  tate transitions
0e90: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
0ea0: 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70  ..** After all p
0eb0: 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ages have been r
0ec0: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
0ed0: 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28  lite_page_unref(
0ee0: 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  ),.** the state 
0ef0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b  transitions back
0f00: 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   to PAGER_UNLOCK
0f10: 2e 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  .  The first tim
0f20: 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65  e.** that sqlite
0f30: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69  3pager_write() i
0f40: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74  s called, the st
0f50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0f60: 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  to.** PAGER_RESE
0f70: 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61  RVED.  (Note tha
0f80: 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72  t sqlite_page_wr
0f90: 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62  ite() can only b
0fa0: 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61  e.** called on a
0fb0: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  n outstanding pa
0fc0: 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74  ge which means t
0fd0: 68 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75  hat the pager mu
0fe0: 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45  st.** be in PAGE
0ff0: 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20  R_SHARED before 
1000: 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  it transitions t
1010: 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  o PAGER_RESERVED
1020: 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  .).** The transi
1030: 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58  tion to PAGER_EX
1040: 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77  CLUSIVE occurs w
1050: 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63  hen before any c
1060: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
1070: 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
1080: 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20  se file.  After 
1090: 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  an sqlite3pager_
10a0: 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72  rollback().** or
10b0: 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f   sqlite_pager_co
10c0: 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74  mmit(), the stat
10d0: 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50  e goes back to P
10e0: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a  AGER_SHARED..*/.
10f0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e  #define PAGER_UN
1100: 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66  LOCK      0.#def
1110: 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ine PAGER_SHARED
1120: 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d        1   /* sam
1130: 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e as SHARED_LOCK
1140: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
1150: 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20  R_RESERVED    2 
1160: 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53    /* same as RES
1170: 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  ERVED_LOCK */.#d
1180: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c  efine PAGER_EXCL
1190: 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73  USIVE   4   /* s
11a0: 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45  ame as EXCLUSIVE
11b0: 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65  _LOCK */.#define
11c0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
11d0: 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74     5../*.** If t
11e0: 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  he SQLITE_BUSY_R
11f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63  ESERVED_LOCK mac
1200: 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  ro is set to tru
1210: 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  e at compile-tim
1220: 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65  e,.** then faile
1230: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65  d attempts to ge
1240: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
1250: 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68  k will invoke th
1260: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e  e busy callback.
1270: 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20  .** This is off 
1280: 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20  by default.  To 
1290: 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65  see why, conside
12a0: 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  r the following 
12b0: 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a  scenario:.** .**
12c0: 20 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20   Suppose thread 
12d0: 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
12e0: 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
12f0: 77 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64  wants a reserved
1300: 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64   lock..** Thread
1310: 20 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61   B already has a
1320: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61   reserved lock a
1330: 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c  nd wants an excl
1340: 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a  usive lock.  If.
1350: 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20  ** both threads 
1360: 61 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20  are using their 
1370: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20  busy callbacks, 
1380: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f  it might be a lo
1390: 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f  ng time.** be fo
13a0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72  r one of the thr
13b0: 65 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64  eads give up and
13c0: 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65   allows the othe
13d0: 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a  r to proceed..**
13e0: 20 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65   But if the thre
13f0: 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74  ad trying to get
1400: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
1410: 63 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63  ck gives up quic
1420: 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65  kly.** (if it ne
1430: 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20  ver invokes its 
1440: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74  busy callback) t
1450: 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69  hen the contenti
1460: 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65  on will be.** re
1470: 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a  solved quickly..
1480: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1490: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
14a0: 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51  LOCK.# define SQ
14b0: 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56  LITE_BUSY_RESERV
14c0: 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66  ED_LOCK 0.#endif
14d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63  ../*.** This mac
14e0: 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73  ro rounds values
14f0: 20 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74   up so that if t
1500: 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61  he value is an a
1510: 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20  ddress it.** is 
1520: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1530: 20 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74   an address that
1540: 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61   is aligned to a
1550: 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72  n 8-byte boundar
1560: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f  y..*/.#define FO
1570: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29  RCE_ALIGNMENT(X)
1580: 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a     (((X)+7)&~7).
1590: 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d  ./*.** Each in-m
15a0: 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61  emory image of a
15b0: 20 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74   page begins wit
15c0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
15d0: 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20  header..** This 
15e0: 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76  header is only v
15f0: 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70  isible to this p
1600: 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68  ager module.  Th
1610: 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65  e client.** code
1620: 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65   that calls page
1630: 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20  r sees only the 
1640: 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1650: 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  s the header..**
1660: 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20  .** Client code 
1670: 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69  should call sqli
1680: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
1690: 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72   on a page prior
16a0: 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e   to making.** an
16b0: 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20  y modifications 
16c0: 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54  to that page.  T
16d0: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71  he first time sq
16e0: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16f0: 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  ().** is called,
1700: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
1710: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
1720: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1730: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1740: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69  rnal and PgHdr.i
1750: 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48  nJournal and PgH
1760: 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20  dr.needSync are 
1770: 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63  set.  Later, onc
1780: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
1790: 20 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69   page has made i
17a0: 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  t onto the disk 
17b0: 73 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e  surface, PgHdr.n
17c0: 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c  eedSync.** is cl
17d0: 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69  eared.  The modi
17e0: 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74  fied page cannot
17f0: 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b   be written back
1800: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1810: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1820: 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f  ile until the jo
1830: 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20  urnal pages has 
1840: 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64  been synced to d
1850: 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50  isk and the.** P
1860: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61  gHdr.needSync ha
1870: 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a  s been cleared..
1880: 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e  **.** The PgHdr.
1890: 64 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65  dirty flag is se
18a0: 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61  t when sqlite3pa
18b0: 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63  ger_write() is c
18c0: 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20  alled and.** is 
18d0: 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68  cleared again wh
18e0: 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  en the page cont
18f0: 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62  ent is written b
1900: 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ack to the origi
1910: 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1920: 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  file..*/.typedef
1930: 20 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67   struct PgHdr Pg
1940: 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64  Hdr;.struct PgHd
1950: 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  r {.  Pager *pPa
1960: 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1970: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1980: 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20  r to which this 
1990: 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a  page belongs */.
19a0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
19d0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  ber for this pag
19e0: 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  e */.  PgHdr *pN
19f0: 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48  extHash, *pPrevH
1a00: 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f  ash;  /* Hash co
1a10: 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f  llision chain fo
1a20: 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a  r PgHdr.pgno */.
1a30: 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72    PgHdr *pNextFr
1a40: 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20  ee, *pPrevFree; 
1a50: 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20   /* Freelist of 
1a60: 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66  pages where nRef
1a70: 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ==0 */.  PgHdr *
1a80: 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20  pNextAll;       
1a90: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73          /* A lis
1aa0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
1ab0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1ac0: 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74  Stmt, *pPrevStmt
1ad0: 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61  ;  /* List of pa
1ae0: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
1af0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ment journal */.
1b00: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
1b30: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1b40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
1b50: 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  inStmt;         
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b70: 52 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74  RUE if in the st
1b80: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
1b90: 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79  al */.  u8 dirty
1ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bb0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1bc0: 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69  f we need to wri
1bd0: 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20  te back changes 
1be0: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
1bf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c00: 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72      /* Sync jour
1c10: 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69  nal before writi
1c20: 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  ng this page */.
1c30: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
1c40: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ack;            
1c50: 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74   /* Disable dont
1c60: 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
1c70: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73  this page */.  s
1c80: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
1cb0: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
1cc0: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
1cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ce0: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
1cf0: 20 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72   sorted by PgHdr
1d00: 2e 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50  .pgno */.  /* pP
1d10: 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20  ager->psAligned 
1d20: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1d30: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1d40: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1d50: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1d60: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1d70: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1d80: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1d90: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1da0: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1db0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1dc0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1dd0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1de0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1df0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1e00: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1e10: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1e20: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1e30: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1e40: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1e50: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1e60: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1e70: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1e80: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1e90: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ea0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1eb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1ec0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1ed0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1ee0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1ef0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1f00: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1f10: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1f20: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
1f30: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
1f40: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
1f50: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
1f60: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
1f70: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
1f80: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
1f90: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
1fa0: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
1fb0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
1fc0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1fd0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
1fe0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
1ff0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
2000: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
2010: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
2020: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2030: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2040: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2050: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2060: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
2070: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2080: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
2090: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
20a0: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
20b0: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
20c0: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
20d0: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
20e0: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
20f0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2100: 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e  P,D,N,X) if( P->
2110: 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f  xCodec ){ P->xCo
2120: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
2130: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65  ,D,N,X); }.#else
2140: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2150: 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a  P,D,N,X).#endif.
2160: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
2170: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
2180: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
2190: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
21a0: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
21b0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
21c0: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
21d0: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
21e0: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
21f0: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
2200: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
2210: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2220: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
2230: 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26  oid*)&((char*)(&
2240: 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73  (G)[1]))[(P)->ps
2250: 41 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e  Aligned]).#defin
2260: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
2270: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
2280: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
2290: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
22a0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73  )[1]))[(PGR)->ps
22b0: 41 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e  Aligned+(PGR)->n
22c0: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
22d0: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
22e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
22f0: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2300: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2310: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2320: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  r..*/.#define N_
2330: 50 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a  PG_HASH 2048../*
2340: 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20  .** Hash a page 
2350: 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  number.*/.#defin
2360: 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29  e pager_hash(PN)
2370: 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41    ((PN)&(N_PG_HA
2380: 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  SH-1))../*.** A 
2390: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
23a0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
23b0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23c0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
23d0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63  ruct Pager {.  c
23e0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
23f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2400: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2410: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
2420: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
2430: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2440: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2450: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2460: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
2470: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
2480: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
2490: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
24a0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66  es */.  OsFile f
24b0: 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20  d, jfd;         
24c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
24d0: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
24e0: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
24f0: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66   */.  OsFile stf
2500: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2510: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2520: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
2530: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
2540: 6c 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  l*/.  int dbSize
2550: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2560: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2570: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
2580: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
2590: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25a0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
25b0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
25c0: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
25d0: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
25e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
25f0: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2600: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2610: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73  gin() */.  i64 s
2620: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
2630: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2640: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d  f journal at stm
2650: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
2660: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
2670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2680: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
2690: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26a0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
26b0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
26c0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
26d0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
26e0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
26f0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
2700: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
2710: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2720: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
2730: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
2740: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2760: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
2770: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
2780: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
2790: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
27a0: 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  tor)(void*,int);
27b0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
27c0: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
27d0: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
27e0: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
27f0: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  void*,int);   /*
2800: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
2810: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
2820: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
2830: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2850: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2860: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
2870: 73 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20  sAligned;       
2880: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69         /* pageSi
2890: 7a 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ze rounded up to
28a0: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38   a multiple of 8
28b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
28e0: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
28f0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ages */.  int nR
2900: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
2910: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2920: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2930: 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52  es with PgHdr.nR
2940: 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ef>0 */.  int mx
2950: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2960: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2970: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2980: 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68   to hold in cach
2990: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c  e */.  int nHit,
29a0: 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20   nMiss, nOvfl;  
29b0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
29c0: 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c  , missing, and L
29d0: 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a  RU overflows */.
29e0: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29    void (*xCodec)
29f0: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2a00: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2a10: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2a20: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2a30: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2a50: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
2a60: 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a  odec() */.  u8 j
2a70: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a90: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
2aa0: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
2ab0: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
2ac0: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
2ad0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2ae0: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
2af0: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
2b00: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b20: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2b30: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2b40: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d  file */.  u8 stm
2b50: 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20  tOpen;          
2b60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2b70: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
2b80: 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  ubjournal is ope
2b90: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e  n */.  u8 stmtIn
2ba0: 55 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  Use;            
2bb0: 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72     /* True we ar
2bc0: 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  e in a statement
2bd0: 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
2be0: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f  */.  u8 stmtAuto
2bf0: 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  open;           
2c00: 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f   /* Open stmt jo
2c10: 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20  urnal when main 
2c20: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65  journal is opene
2c30: 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b  d*/.  u8 noSync;
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
2c60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
2c70: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
2c80: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
2c90: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
2ca0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
2cb0: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2cc0: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74  tness */.  u8 st
2cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
2ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
2cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
2d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
2d10: 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b   */.  u8 errMask
2d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d30: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65    /* One of seve
2d40: 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72  ral kinds of err
2d50: 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70  ors */.  u8 temp
2d60: 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
2d70: 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d       /* zFilenam
2d80: 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  e is a temporary
2d90: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65   file */.  u8 re
2da0: 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20  adOnly;         
2db0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
2dc0: 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  or a read-only d
2dd0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
2de0: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e00: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2e10: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2e20: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2e30: 64 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20  dirtyCache;     
2e40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e50: 20 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73   if cached pages
2e60: 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f   have changed */
2e70: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2e80: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f  back;          /
2e90: 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72  * Disable dont_r
2ea0: 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c  ollback() for al
2eb0: 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20  l pages */.  u8 
2ec0: 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20  memDb;          
2ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2ee0: 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20   to inhibit all 
2ef0: 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38  file I/O */.  u8
2f00: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
2f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2f20: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2f30: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f40: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
2f50: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f70: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f80: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f90: 65 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73  e */.  u8 setMas
2fa0: 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ter;            
2fb0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
2fc0: 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65  m-j name has bee
2fd0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e  n written to jrn
2fe0: 6c 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c  l */.  BusyHandl
2ff0: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
3000: 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  ;  /* Pointer to
3010: 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64   sqlite.busyHand
3020: 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ler */.  PgHdr *
3030: 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20  pFirst, *pLast; 
3040: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
3050: 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20  free pages */.  
3060: 50 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e  PgHdr *pFirstSyn
3070: 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  ced;        /* F
3080: 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77  irst free page w
3090: 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ith PgHdr.needSy
30a0: 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  nc==0 */.  PgHdr
30b0: 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20   *pAll;         
30c0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
30d0: 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20  f all pages */. 
30e0: 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20   PgHdr *pStmt;  
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3100: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
3110: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
3120: 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  ubjournal */.  i
3130: 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20  64 journalOff;  
3140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
3150: 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65  rrent byte offse
3160: 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t in the journal
3170: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
3180: 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20  ournalHdr;      
3190: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
31a0: 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75  ffset to previou
31b0: 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  s journal header
31c0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64   */.  i64 stmtHd
31d0: 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  rOff;           
31e0: 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e    /* First journ
31f0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
3200: 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  n this statement
3210: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b   */.  i64 stmtCk
3220: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
3230: 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77    /* cksumInit w
3240: 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61  hen statement wa
3250: 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69  s started */.  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 20 20 50 67 48 64 72 20 2a 61 48  k */.  PgHdr *aH
32b0: 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20  ash[N_PG_HASH]; 
32c0: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
32d0: 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d   to map page num
32e0: 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a  ber to PgHdr */.
32f0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
3300: 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61  are bits that ca
3310: 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65  n be set in Page
3320: 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64  r.errMask..*/.#d
3330: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3340: 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f  FULL     0x01  /
3350: 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c  * a write() fail
3360: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ed */.#define PA
3370: 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20  GER_ERR_MEM     
3380: 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63   0x02  /* malloc
3390: 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65  () failed */.#de
33a0: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c  fine PAGER_ERR_L
33b0: 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a  OCK     0x04  /*
33c0: 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f   error in the lo
33d0: 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a  cking protocol *
33e0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
33f0: 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30  ERR_CORRUPT  0x0
3400: 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f  8  /* database o
3410: 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70  r journal corrup
3420: 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tion */.#define 
3430: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20  PAGER_ERR_DISK  
3440: 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65     0x10  /* gene
3450: 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  ral disk I/O err
3460: 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72  or - bad hard dr
3470: 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a  ive? */../*.** J
3480: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
3490: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
34a0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
34b0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
34c0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
34d0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
34e0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
34f0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3500: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3510: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3520: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3530: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3540: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3550: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3560: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3570: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3580: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
3590: 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  egin.** written,
35a0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
35b0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
35c0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
35d0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
35e0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
35f0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3600: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3610: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3620: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3630: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3640: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3650: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3660: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3670: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3680: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3690: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
36a0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
36b0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
36c0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
36d0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
36e0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
36f0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3700: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3710: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3720: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3730: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3740: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3750: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3760: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3770: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3780: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3790: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
37a0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
37b0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
37c0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
37d0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
37e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
37f0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3800: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3810: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3820: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3830: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3840: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3850: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3860: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3870: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
3880: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
3890: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
38a0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
38b0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
38c0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
38d0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
38e0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
38f0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
3900: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
3910: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
3920: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
3930: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
3940: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
3950: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
3960: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
3970: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
3980: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
3990: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
39a0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
39b0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
39c0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
39d0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
39e0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
39f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
3a00: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
3a10: 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  and of each page
3a20: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3a30: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
3a40: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
3a50: 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65  g macros..*/.#de
3a60: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
3a70: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
3a80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
3a90: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
3aa0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
3ab0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
3ac0: 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72  er. In the futur
3ad0: 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65  e, this could be
3ae0: 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  .** set to some 
3af0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
3b00: 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c  the disk control
3b10: 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61  ler. The importa
3b20: 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69  nt.** characteri
3b30: 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20  stic is that it 
3b40: 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  is the same size
3b50: 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f   as a disk secto
3b60: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  r..*/.#define JO
3b70: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
3b80: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
3b90: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
3ba0: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
3bb0: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
3bc0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
3bd0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
3be0: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
3bf0: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
3c00: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
3c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
3c20: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
3c30: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
3c40: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
3c50: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
3c60: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
3c70: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
3c80: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
3c90: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
3ca0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3cb0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
3cc0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
3cd0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
3ce0: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
3cf0: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
3d00: 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a   The default siz
3d10: 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74  e of a disk sect
3d20: 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  or.*/.#define PA
3d30: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20  GER_SECTOR_SIZE 
3d40: 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  512../*.** Page 
3d50: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
3d60: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
3d70: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
3d80: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
3d90: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
3da0: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
3db0: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
3dc0: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
3dd0: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
3de0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
3df0: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
3e00: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
3e10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
3e20: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
3e30: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
3e40: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
3e50: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
3e60: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
3e70: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
3e80: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
3e90: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
3ea0: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
3eb0: 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65  tails..*/./* #de
3ec0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
3ed0: 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42  NO(x) (PENDING_B
3ee0: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
3ef0: 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ze)) */.#define 
3f00: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
3f10: 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f   ((PENDING_BYTE/
3f20: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
3f30: 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  +1)../*.** Enabl
3f40: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3f50: 74 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20  t tracking (for 
3f60: 64 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a  debugging) here:
3f70: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3f80: 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67  E_TEST.  int pag
3f90: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
3fa0: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
3fb0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
3fc0: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
3fd0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
3fe0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
3ff0: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
4000: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
4010: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4020: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4030: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4040: 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  =%p nRef=%d\n",.
4050: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
4060: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4070: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
4080: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
4090: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
40a0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
40b0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
40c0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
40d0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
40e0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
40f0: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4100: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
4110: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
4120: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
4130: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
4140: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
4150: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
4160: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
4170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
4180: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
4190: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
41a0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
41b0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
41c0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
41d0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
41e0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
41f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4200: 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c  read32bits(OsFil
4210: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
4220: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
4230: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
4240: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4250: 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65   &res, sizeof(re
4260: 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  s));.  if( rc==S
4270: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
4290: 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [4];.    memcpy(
42a0: 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20  ac, &res, 4);.  
42b0: 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c    res = (ac[0]<<
42c0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
42d0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
42e0: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70   ac[3];.  }.  *p
42f0: 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74  Res = res;.  ret
4300: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4310: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4320: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
4330: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4340: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
4350: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
4360: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
4370: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4380: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
43a0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
43b0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
43c0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
43d0: 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d  r ac[4];.  ac[0]
43e0: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
43f0: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
4400: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
4410: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
4420: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
4430: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
4440: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4450: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4460: 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 4);.}../*.** W
4470: 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20  rite the 32-bit 
4480: 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e  integer 'val' in
4490: 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  to the page iden
44a0: 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68  tified by page h
44b0: 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20  eader.** 'p' at 
44c0: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e  offset 'offset'.
44d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44e0: 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20  store32bits(u32 
44f0: 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69  val, PgHdr *p, i
4500: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4510: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4520: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4530: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4540: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
4550: 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  et];.  ac[0] = (
4560: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
4570: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
4580: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
4590: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
45a0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
45b0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
45c0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
45d0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20  -bit integer at 
45e0: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20  offset 'offset' 
45f0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64  from the page id
4600: 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
4610: 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a  age header 'p'..
4620: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
4630: 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48  trieve32bits(PgH
4640: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
4650: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
4660: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
4670: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
4680: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
4690: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72  p))[offset];.  r
46a0: 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34  eturn (ac[0]<<24
46b0: 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20  ) | (ac[1]<<16) 
46c0: 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61  | (ac[2]<<8) | a
46d0: 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  c[3];.}.../*.** 
46e0: 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73  Convert the bits
46f0: 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e   in the pPager->
4700: 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20  errMask into an 
4710: 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65  approprate.** re
4720: 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  turn code..*/.st
4730: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4740: 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50  rrcode(Pager *pP
4750: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
4760: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4770: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4780: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c  sk & PAGER_ERR_L
4790: 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  OCK )    rc = SQ
47a0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
47b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
47c0: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
47d0: 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20  _DISK )    rc = 
47e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
47f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
4800: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
4810: 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53  FULL )    rc = S
4820: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66  QLITE_FULL;.  if
4830: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4840: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  k & PAGER_ERR_ME
4850: 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c  M )     rc = SQL
4860: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
4870: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4880: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52   & PAGER_ERR_COR
4890: 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49  RUPT ) rc = SQLI
48a0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
48b0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
48c0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
48d0: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
48e0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
48f0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
4900: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
4910: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4920: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
4930: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
4940: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
4950: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
4960: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
4970: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
4980: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
4990: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
49a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
49b0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
49c0: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
49d0: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
49e0: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
49f0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4a00: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4a10: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
4a20: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
4a30: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
4a40: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
4a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
4a60: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
4a70: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
4a80: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
4a90: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
4aa0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
4ab0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
4ac0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
4ad0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
4ae0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
4af0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
4b00: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
4b10: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
4b20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
4b30: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
4b40: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
4b50: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
4b60: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
4b70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4b80: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
4b90: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
4ba0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4bb0: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
4bc0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
4bd0: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
4be0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4bf0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
4c00: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
4c10: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
4c20: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4c30: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
4c40: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4c50: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
4c60: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
4c70: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
4c80: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
4c90: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
4ca0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
4cb0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
4cc0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
4cd0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
4ce0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4cf0: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
4d00: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
4d10: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
4d20: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
4d30: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
4d40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4d50: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
4d60: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
4d70: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
4d80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4d90: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
4da0: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
4db0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
4dc0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
4dd0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
4de0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
4df0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
4e00: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4e10: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
4e20: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
4e30: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
4e40: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
4e50: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
4e60: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
4e70: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
4e80: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
4e90: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
4ea0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
4eb0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
4ec0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
4ed0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
4ee0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
4ef0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
4f00: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
4f10: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
4f20: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
4f30: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
4f40: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
4f50: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
4f60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
4f70: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
4f80: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
4f90: 7d 0a 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b  }.  (*pzMaster)[
4fa0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  len] = '\0';.   
4fb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4fc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
4fd0: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ek the journal f
4fe0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
4ff0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
5000: 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65  r boundary where
5010: 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65   a.** journal he
5020: 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64  ader may be read
5030: 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67   or written. Pag
5040: 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73  er.journalOff is
5050: 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a   updated with.**
5060: 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66   the new seek of
5070: 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20  fset..**.** i.e 
5080: 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a  for a sector siz
5090: 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20  e of 512:.**.** 
50a0: 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20  Input Offset    
50b0: 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74            Output
50c0: 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d   Offset.** -----
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20  --.** 0         
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20  0.** 512        
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5130: 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20  12.** 100       
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20  512.** 2000     
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
5180: 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72  tic int seekJour
5190: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
51a0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66  ager){.  i64 off
51b0: 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63  set = 0;.  i64 c
51c0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
51d0: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29  alOff;.  if( c )
51e0: 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28  {.    offset = (
51f0: 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44  (c-1)/JOURNAL_HD
5200: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31  R_SZ(pPager) + 1
5210: 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ) * JOURNAL_HDR_
5220: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
5230: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
5240: 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  %JOURNAL_HDR_SZ(
5250: 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20  pPager)==0 );.  
5260: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
5270: 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  c );.  assert( (
5280: 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41  offset-c)<JOURNA
5290: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
52a0: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   );.  pPager->jo
52b0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65  urnalOff = offse
52c0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  t;.  return sqli
52d0: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
52e0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
52f0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a  journalOff);.}..
5300: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
5310: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
5320: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
5330: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
5340: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
5350: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
5360: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
5370: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
5380: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
5390: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
53a0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
53b0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
53c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
53d0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
53e0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
53f0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
5400: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
5410: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
5420: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
5430: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
5440: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
5450: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
5460: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
5470: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
5480: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
5490: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
54a0: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
54b0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
54c0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
54d0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
54e0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
54f0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
5500: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
5510: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
5520: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
5530: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
5540: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
5550: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
5560: 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20  ger){..  int rc 
5570: 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72  = seekJournalHdr
5580: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
5590: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
55a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
55b0: 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e  alHdr = pPager->
55c0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66  journalOff;.  if
55d0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64  ( pPager->stmtHd
55e0: 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  rOff==0 ){.    p
55f0: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
5600: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
5610: 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50  nalHdr;.  }.  pP
5620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5630: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
5640: 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f  SZ(pPager);..  /
5650: 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a  * FIX ME: .  **.
5660: 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f    ** Possibly fo
5670: 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e  r a pager not in
5680: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74   no-sync mode, t
5690: 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63  he journal magic
56a0: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a   should not.  **
56b0: 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69   be written unti
56c0: 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64  l nRec is filled
56d0: 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e   in as part of n
56e0: 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  ext syncJournal(
56f0: 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ). .  **.  ** Ac
5700: 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65  tually maybe the
5710: 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68   whole journal h
5720: 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20  eader should be 
5730: 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68  delayed until th
5740: 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54  at.  ** point. T
5750: 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e  hink about this.
5760: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
5770: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
5780: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
5790: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
57a0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
57b0: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
57c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
57d0: 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20  The nRec Field. 
57e0: 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e  0xFFFFFFFF for n
57f0: 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e  o-sync journals.
5800: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69   */.    rc = wri
5810: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
5820: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
5830: 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66  oSync ? 0xffffff
5840: 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69  ff : 0);.  }.  i
5850: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5860: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   ){.    /* The r
5870: 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68  andom check-hash
5880: 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20   initialiser */ 
5890: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64  .    sqlite3Rand
58a0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
58b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
58c0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
58d0: 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  Init);.    rc = 
58e0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
58f0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
5900: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
5910: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
5920: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
5930: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
5940: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  base size */.   
5950: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5960: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5970: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
5980: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5990: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
59a0: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
59b0: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
59c0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
59d0: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
59e0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
59f0: 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  , pPager->sector
5a00: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
5a10: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5a20: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
5a30: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
5a40: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
5a50: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
5a60: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
5a70: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
5a80: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
5a90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
5aa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5ab0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
5ac0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
5ad0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ae0: 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  -1);.    rc = sq
5af0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
5b00: 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30  ager->jfd, "\000
5b10: 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ", 1);.  }.  ret
5b20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5b30: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5b40: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
5b50: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5b60: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
5b70: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
5b80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
5b90: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
5ba0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
5bb0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
5bc0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
5bd0: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
5be0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
5bf0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
5c00: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
5c10: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
5c20: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
5c30: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
5c40: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
5c50: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
5c60: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
5c70: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
5c80: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
5c90: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
5ca0: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
5cb0: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
5cc0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
5cd0: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
5ce0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
5cf0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
5d00: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
5d10: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
5d20: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
5d30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
5d40: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
5d50: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
5d60: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
5d70: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
5d80: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
5d90: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
5da0: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
5db0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
5dc0: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
5dd0: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
5de0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
5df0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
5e00: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
5e10: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5e20: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
5e30: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
5e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
5e50: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
5e60: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
5e70: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
5e80: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
5e90: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
5ea0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
5eb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
5ec0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
5ed0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
5ee0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
5ef0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
5f00: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
5f10: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5f20: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  n rc;..  if( pPa
5f30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
5f40: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5f50: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
5f60: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
5f70: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
5f80: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
5f90: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
5fa0: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
5fb0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b  sizeof(aMagic));
5fc0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
5fd0: 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65  rn rc;..  if( me
5fe0: 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f  mcmp(aMagic, aJo
5ff0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6000: 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29  of(aMagic))!=0 )
6010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6020: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20  ITE_DONE;.  }.. 
6030: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6040: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
6050: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6060: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6070: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6080: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  &pPager->jfd, &p
6090: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
60a0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
60b0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
60c0: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
60d0: 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a  ger->jfd, pDbSiz
60e0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
60f0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
6100: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
6110: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
6120: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
6130: 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20  e used by .  ** 
6140: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6150: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
6160: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
6170: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20  ournal was.  ** 
6180: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
6190: 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20  cess other than 
61a0: 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74  this one, then t
61b0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  his routine.  **
61c0: 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
61d0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67   from within pag
61e0: 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54  er_playback(). T
61f0: 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20  he local value. 
6200: 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63   ** of Pager.sec
6210: 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f  torSize is resto
6220: 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  red at the end o
6230: 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a  f that routine..
6240: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
6250: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6260: 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61  jfd, (u32 *)&pPa
6270: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6280: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6290: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
62a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
62b0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
62c0: 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
62d0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
62e0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
62f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
6300: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6310: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
6320: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
6330: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
6340: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
6350: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
6360: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
6370: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
6380: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
6390: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
63a0: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
63b0: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
63c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
63d0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
63e0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
63f0: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
6400: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6410: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
6420: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
6430: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
6440: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
6450: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
6460: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
6470: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
6480: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
6490: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
64a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
64b0: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
64c0: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
64d0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
64e0: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
64f0: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
6500: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
6510: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
6520: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
6530: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
6540: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
6550: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
6560: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a  ournal name..*/.
6570: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
6580: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
6590: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
65a0: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
65b0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
65c0: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
65d0: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
65e0: 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61   0; ..  if( !zMa
65f0: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
6600: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
6610: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
6620: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
6630: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
6640: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
6650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
6660: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
6670: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
6680: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
6690: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
66a0: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
66b0: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
66c0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
66d0: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
66e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
66f0: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
6700: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
6710: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
6720: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
6730: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
6740: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
6750: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
6760: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
6770: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6780: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
6790: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
67a0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
67b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
67c0: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
67d0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
67e0: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
67f0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
6800: 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63  ager));.  if( rc
6810: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6820: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6830: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6840: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  &pPager->jfd, zM
6850: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
6860: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6870: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6880: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
6890: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
68a0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
68b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
68c0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77  rn rc;..  rc = w
68d0: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
68e0: 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b  er->jfd, cksum);
68f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6900: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6910: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
6920: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
6930: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
6940: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
6950: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
6960: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
6970: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 1;.  return r
6980: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
6990: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
69a0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
69b0: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
69c0: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
69d0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
69e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
69f0: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
6a00: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
6a10: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
6a20: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
6a30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
6a40: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
6a50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
6a60: 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  mt_commit().** r
6a70: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
6a80: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
6a90: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
6aa0: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
6ab0: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
6ac0: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
6ad0: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
6ae0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
6af0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
6b00: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
6b10: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
6b20: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
6b30: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
6b40: 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74  .  if( pPg->inSt
6b50: 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  mt ) return;.  a
6b60: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65  ssert( pPg->pPre
6b70: 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d  vStmt==0 && pPg-
6b80: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
6b90: 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  .  pPg->pPrevStm
6ba0: 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  t = 0;.  if( pPa
6bb0: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
6bc0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d    pPager->pStmt-
6bd0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
6be0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6bf0: 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d  xtStmt = pPager-
6c00: 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72  >pStmt;.  pPager
6c10: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  ->pStmt = pPg;. 
6c20: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31   pPg->inStmt = 1
6c30: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
6c40: 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
6c50: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
6c60: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70   *pPg){.  if( !p
6c70: 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74  Pg->inStmt ) ret
6c80: 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
6c90: 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20  pPrevStmt ){.   
6ca0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
6cb0: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
6cc0: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
6cd0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
6ce0: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e  NextStmt = pPg->
6cf0: 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c  pNextStmt;.  }el
6d00: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
6d10: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74  pPg->pPager->pSt
6d20: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
6d30: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
6d40: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
6d50: 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  mt;.  }.  if( pP
6d60: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a  g->pNextStmt ){.
6d70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
6d80: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
6d90: 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  vStmt==pPg );.  
6da0: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
6db0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
6dc0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20  g->pPrevStmt;.  
6dd0: 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  }.  pPg->pNextSt
6de0: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  mt = 0;.  pPg->p
6df0: 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20  PrevStmt = 0;.  
6e00: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pPg->inStmt = 0;
6e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
6e20: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
6e30: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
6e40: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
6e50: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
6e60: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
6e70: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
6e80: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
6e90: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
6ea0: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
6eb0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
6ec0: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67   PgHdr *p = pPag
6ed0: 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f  er->aHash[pager_
6ee0: 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77  hash(pgno)];.  w
6ef0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
6f00: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
6f10: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
6f20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
6f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
6f40: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  k the database a
6f50: 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d  nd clear the in-
6f60: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54  memory cache.  T
6f70: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  his routine.** s
6f80: 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66  ets the state of
6f90: 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20   the pager back 
6fa0: 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77  to what it was w
6fb0: 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74  hen it was first
6fc0: 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79  .** opened.  Any
6fd0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
6fe0: 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
6ff0: 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  ed and subsequen
7000: 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f  t attempts.** to
7010: 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61   access those pa
7020: 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ges will likely 
7030: 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
7040: 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dump..*/.static 
7050: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74  void pager_reset
7060: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
7070: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
7080: 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67  pNext;.  for(pPg
7090: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
70a0: 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
70b0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
70c0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
70d0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
70e0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46    }.  pPager->pF
70f0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
7100: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
7110: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7120: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
7130: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
7140: 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
7150: 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
7160: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
7170: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ;.  pPager->nPag
7180: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
7190: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
71a0: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
71b0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
71c0: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
71d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
71e0: 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
71f0: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7200: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
7210: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
7220: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
7230: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e   -1;.  pPager->n
7240: 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Ref = 0;.  asser
7250: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
7260: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a  alOpen==0 );.}..
7270: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
7280: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7290: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
72a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
72b0: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
72c0: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
72d0: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
72e0: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
72f0: 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73  s routine releas
7300: 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
7310: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
7320: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
7330: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
7340: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a    The journal.**
7350: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
7360: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a   and closed..**.
7370: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
7380: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
7390: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
73a0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
73b0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
73c0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
73d0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
73e0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
73f0: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
7400: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
7410: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
7420: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
7430: 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  t pager_unwritel
7440: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
7450: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
7460: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
7470: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
7480: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7490: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
74a0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
74b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
74c0: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
74d0: 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
74e0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
74f0: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
7500: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
7510: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
7520: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
7530: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  tOpen = 0;.  }. 
7540: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
7550: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
7560: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7570: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
7580: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
7590: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73  lOpen = 0;.    s
75a0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
75b0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
75c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
75d0: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
75e0: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
75f0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
7600: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
7610: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
7620: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
7630: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
7640: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
7650: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
7660: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
7670: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
7680: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
7690: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
76a0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
76b0: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
76c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
76d0: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d  ger->dirtyCache=
76e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73  =0 || pPager->us
76f0: 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  eJournal==0 );. 
7700: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
7710: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
7720: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
7730: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
7740: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
7750: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
7760: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
7770: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
7780: 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  er = 0;.  return
7790: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
77a0: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
77b0: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
77c0: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
77d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
77e0: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
77f0: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
7800: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
7810: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
7820: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
7830: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
7840: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
7850: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
7860: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
7870: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
7880: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
7890: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
78a0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
78b0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
78c0: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
78d0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
78e0: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
78f0: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
7900: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
7910: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
7920: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
7930: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
7940: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
7950: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
7960: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
7970: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
7980: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
7990: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
79a0: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
79b0: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
79c0: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
79d0: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
79e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
79f0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
7a00: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
7a10: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
7a20: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
7a30: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
7a40: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
7a50: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
7a60: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
7a70: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
7a80: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
7a90: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
7aa0: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
7ab0: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
7ac0: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
7ad0: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
7ae0: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
7af0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
7b00: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
7b10: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
7b20: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
7b30: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
7b40: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
7b50: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
7b60: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
7b70: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
7b80: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
7b90: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
7ba0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
7bb0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
7bc0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
7bd0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74  Pgno pgno, const
7be0: 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20   char *aData){. 
7bf0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
7c00: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
7c10: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
7c20: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
7c30: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
7c40: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
7c50: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
7c60: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
7c70: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a  n cksum;.}../*.*
7c80: 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
7c90: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f  page from the jo
7ca0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65  urnal file opene
7cb0: 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  d on file descri
7cc0: 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c  ptor.** jfd.  Pl
7cd0: 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20  ayback this one 
7ce0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  page..**.** If u
7cf0: 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65  seCksum==0 it me
7d00: 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ans this journal
7d10: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68   does not use ch
7d20: 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73  ecksums.  Checks
7d30: 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75  ums.** are not u
7d40: 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74  sed in statement
7d50: 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73   journals becaus
7d60: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
7d70: 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e  nals do not.** n
7d80: 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70  eed to survive p
7d90: 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a  ower failures..*
7da0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7db0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
7dc0: 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
7dd0: 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c  er, OsFile *jfd,
7de0: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a   int useCksum){.
7df0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
7e00: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
7e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
7e20: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
7e30: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
7e40: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e60: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
7e70: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
7e80: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
7e90: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
7ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
7eb0: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
7ec0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
7ed0: 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49  .  u8 aData[SQLI
7ee0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
7ef0: 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ];  /* Temp stor
7f00: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
7f10: 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  /..  rc = read32
7f20: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
7f30: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7f40: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7f50: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
7f60: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44  3OsRead(jfd, &aD
7f70: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
7f80: 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  eSize);.  if( rc
7f90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7fa0: 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65  turn rc;.  pPage
7fb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
7fc0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
7fd0: 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e  e + 4;..  /* San
7fe0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
7ff0: 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20  the page.  This 
8000: 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e  is more importan
8010: 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61  t that I origina
8020: 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74  lly.  ** thought
8030: 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61  .  If a power fa
8040: 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69  ilure occurs whi
8050: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
8060: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
8070: 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63  .  ** it could c
8080: 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74  ause invalid dat
8090: 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  a to be written 
80a0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
80b0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20  .  We need to.  
80c0: 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69  ** detect this i
80d0: 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74  nvalid data (wit
80e0: 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  h high probabili
80f0: 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  ty) and ignore i
8100: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  t..  */.  if( pg
8110: 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
8120: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
8130: 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
8140: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8150: 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28    }.  if( pgno>(
8160: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
8170: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
8180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8190: 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b  .  }.  if( useCk
81a0: 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  sum ){.    rc = 
81b0: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
81c0: 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28  &cksum);.    if(
81d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
81e0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
81f0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20  rnalOff += 4;.  
8200: 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
8210: 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  m(pPager, pgno, 
8220: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
8230: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8240: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
8250: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
8260: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
8270: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
8280: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
8290: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
82a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
82b0: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
82c0: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
82d0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
82e0: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
82f0: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
8300: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
8310: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
8320: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
8330: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
8340: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8350: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
8360: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
8370: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
8380: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
8390: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
83a0: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
83b0: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
83c0: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
83d0: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
83e0: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
83f0: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
8400: 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  irty..  */.  pPg
8410: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
8420: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
8430: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8440: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
8450: 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20 29  CLUSIVE || pPg )
8460: 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59  ;.  TRACE3("PLAY
8470: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c  BACK %d page %d\
8480: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
8490: 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  er), pgno);.  if
84a0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
84b0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
84c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
84d0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
84e0: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
84f0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
8500: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
8510: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
8520: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
8530: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8540: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  );.  }.  if( pPg
8550: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
8560: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
8570: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  e rolled back th
8580: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
8590: 63 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20  cept for page.  
85a0: 20 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20    ** 1 which is 
85b0: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
85c0: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
85d0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
85e0: 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74  abase.    ** act
85f0: 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
8600: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
8610: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
8620: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
8630: 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61  no==1 );.    pDa
8640: 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
8650: 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d  TA(pPg);.    mem
8660: 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61  cpy(pData, aData
8670: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
8680: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ze);.    if( pPa
8690: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
86a0: 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45   ){  /*** FIX ME
86b0: 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62  :  Should this b
86c0: 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a  e xReinit? ***/.
86d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44        pPager->xD
86e0: 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c  estructor(pData,
86f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8700: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
8710: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
8720: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
8730: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   ){.      pPg->d
8740: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
8750: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
8760: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44  0;.    }.    COD
8770: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
8780: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
8790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
87a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
87b0: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
87c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
87d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
87e0: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
87f0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
8800: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
8810: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8820: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
8830: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
8840: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8850: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
8860: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
8870: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8880: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
8890: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
88a0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
88b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
88c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
88d0: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
88e0: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
88f0: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
8900: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
8910: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
8920: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
8930: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
8940: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
8950: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
8960: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
8970: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
8980: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
8990: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
89a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
89b0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
89c0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
89d0: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
89e0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
89f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
8a00: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
8a10: 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65  ;.  OsFile maste
8a20: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  r;.  char *zMast
8a30: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
8a40: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
8a50: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8a60: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
8a70: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
8a80: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
8a90: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
8aa0: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
8ab0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8ac0: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
8ad0: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
8ae0: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
8af0: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
8b00: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
8b10: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
8b20: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
8b30: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  rence..  */.  me
8b40: 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c  mset(&master, 0,
8b50: 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29   sizeof(master))
8b60: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8b70: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
8b80: 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29  Master, &master)
8b90: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8ba0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
8bb0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
8bc0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20  ster_open = 1;. 
8bd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
8be0: 69 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72 2c  ileSize(&master,
8bf0: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
8c00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8c10: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
8c20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
8c30: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
8c40: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
8c50: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
8c60: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
8c70: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
8c80: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
8c90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8ca0: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
8cb0: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
8cc0: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
8cd0: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
8ce0: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
8cf0: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
8d00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
8d10: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
8d20: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
8d30: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
8d40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
8d50: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
8d60: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
8d70: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8d80: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
8d90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
8da0: 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (&master, zMaste
8db0: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
8dc0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
8dd0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8de0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
8df0: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
8e00: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
8e10: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
8e20: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
8e30: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
8e40: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
8e50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
8e60: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75  sFileExists(zJou
8e70: 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
8e80: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
8e90: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
8ea0: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
8eb0: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
8ec0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
8ed0: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
8ee0: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
8ef0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8f00: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
8f10: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
8f20: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
8f30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8f40: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
8f50: 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a          OsFile j
8f60: 6f 75 72 6e 61 6c 3b 0a 0a 20 20 20 20 20 20 20  ournal;..       
8f70: 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c   memset(&journal
8f80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72  , 0, sizeof(jour
8f90: 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72  nal));.        r
8fa0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
8fb0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
8fc0: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
8fd0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
8fe0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8ff0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9000: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9010: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
9020: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
9030: 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(&journal, &z
9040: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9050: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9060: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9070: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9090: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
90a0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
90b0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
90c0: 7a 4d 61 73 74 65 72 50 74 72 20 26 26 20 21 73  zMasterPtr && !s
90d0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
90e0: 2c 20 7a 4d 61 73 74 65 72 29 20 29 7b 0a 20 20  , zMaster) ){.  
90f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
9100: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
9110: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9120: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9130: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
9140: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9150: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
9160: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
9170: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
9180: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
9190: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
91a0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
91b0: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
91c0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
91d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
91e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
91f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9200: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
9210: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
9220: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
9230: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
9240: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9250: 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65   Make every page
9260: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67   in the cache ag
9270: 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73  ree with what is
9280: 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74   on disk.  In ot
9290: 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65  her words,.** re
92a0: 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f  read the disk to
92b0: 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65   reset the state
92c0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   of the cache..*
92d0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
92e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
92f0: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20  r a rollback in 
9300: 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68  which some of th
9310: 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a  e dirty cache.**
9320: 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72   pages had never
9330: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75   been written ou
9340: 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e  t to disk.  We n
9350: 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eed to roll back
9360: 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f   the.** cache co
9370: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61  ntent and the ea
9380: 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20  siest way to do 
9390: 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61  that is to rerea
93a0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
93b0: 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74  t.** back from t
93c0: 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  he disk..*/.stat
93d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c  ic int pager_rel
93e0: 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20  oad_cache(Pager 
93f0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9400: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
9410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9420: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
9430: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
9440: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
9450: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c     char zBuf[SQL
9460: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
9470: 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67  E];.    if( !pPg
9480: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
9490: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
94a0: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
94b0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
94c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
94d0: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
94e0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
94f0: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
9500: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
9510: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9520: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ead(&pPager->fd,
9530: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
9540: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
9550: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
9560: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
9570: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
9580: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
9590: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
95a0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
95b0: 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d  ager, zBuf, pPg-
95c0: 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d  >pgno, 2);.    }
95d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
95e0: 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67  et(zBuf, 0, pPag
95f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9600: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
9610: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d  ->nRef==0 || mem
9620: 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f  cmp(zBuf, PGHDR_
9630: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
9640: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
9650: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
9660: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
9670: 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  g), zBuf, pPager
9680: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9690: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
96a0: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
96b0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
96c0: 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44  niter(PGHDR_TO_D
96d0: 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
96e0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
96f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9700: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
9710: 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
9720: 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
9730: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  >nExtra);.      
9740: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  }.    }.    pPg-
9750: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9760: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
9770: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
9780: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
9790: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
97a0: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
97b0: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
97c0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
97d0: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73   indicated..*/.s
97e0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
97f0: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
9800: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
9810: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
9820: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
9830: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
9840: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
9850: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
9860: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
9870: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
9880: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
9890: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
98a0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
98b0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
98c0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
98d0: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
98e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
98f0: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
9900: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
9910: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
9920: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
9930: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9940: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
9950: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
9960: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
9970: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
9980: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
9990: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
99a0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
99b0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
99c0: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
99d0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
99e0: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
99f0: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
9a00: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
9a10: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
9a20: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
9a30: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
9a40: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
9a50: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
9a60: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
9a70: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
9a80: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
9a90: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
9aa0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
9ab0: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
9ac0: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
9ad0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
9ae0: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
9af0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
9b00: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
9b10: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9b20: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
9b30: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
9b40: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
9b50: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
9b60: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
9b70: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
9b80: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
9b90: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
9ba0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
9bb0: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
9bc0: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
9bd0: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
9be0: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
9bf0: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
9c00: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
9c10: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
9c20: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
9c30: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
9c40: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
9c50: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
9c60: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
9c70: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
9c80: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
9c90: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
9ca0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
9cb0: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
9cc0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
9cd0: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
9ce0: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
9cf0: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
9d00: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
9d10: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
9d20: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
9d30: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
9d40: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
9d50: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
9d60: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
9d70: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
9d80: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
9d90: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
9da0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
9db0: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
9dc0: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
9dd0: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
9de0: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
9df0: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
9e00: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
9e10: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
9e20: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
9e30: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
9e40: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
9e50: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
9e60: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
9e70: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9e80: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
9e90: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
9ea0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
9eb0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
9ec0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
9ed0: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
9ee0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
9ef0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
9f00: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
9f10: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
9f20: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
9f30: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
9f40: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
9f50: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
9f60: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
9f70: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
9f80: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
9f90: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
9fa0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
9fb0: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
9fc0: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
9fd0: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
9fe0: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
9ff0: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
a000: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
a010: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
a020: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
a030: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
a040: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
a050: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
a060: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
a070: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
a080: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
a090: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
a0a0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
a0b0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
a0c0: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
a0d0: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
a0e0: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
a0f0: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
a100: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
a110: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
a120: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
a130: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
a140: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
a150: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
a160: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
a170: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
a180: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
a190: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
a1a0: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
a1b0: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
a1c0: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
a1d0: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
a1e0: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
a1f0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
a200: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
a210: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
a220: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
a230: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
a240: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
a250: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
a260: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
a270: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
a280: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
a290: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
a2a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
a2b0: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
a2c0: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
a2d0: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
a2e0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
a2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a300: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
a310: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
a320: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
a330: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a340: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
a350: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
a360: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
a370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a380: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
a390: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
a3a0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a3c0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
a3d0: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
a3e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a3f0: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
a400: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
a410: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a430: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
a440: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
a450: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
a460: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
a470: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
a480: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
a490: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
a4a0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
a4b0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
a4c0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
a4d0: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
a4e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
a4f0: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
a500: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
a510: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
a520: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a530: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
a540: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
a550: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a560: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
a570: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
a580: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
a590: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
a5a0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
a5b0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
a5c0: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
a5d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a5e0: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
a5f0: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
a600: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
a610: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
a620: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
a630: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
a640: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
a650: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
a660: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
a670: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
a680: 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l(&pPager->jfd, 
a690: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
a6a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a6b0: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
a6c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
a6d0: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
a6e0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
a6f0: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
a700: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
a710: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
a720: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
a730: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
a740: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a750: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
a760: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
a770: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
a780: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
a790: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a7a0: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
a7b0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
a7c0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
a7d0: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
a7e0: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
a7f0: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
a800: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
a810: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
a820: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
a830: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
a840: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
a850: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a860: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
a870: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
a880: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
a890: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
a8a0: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
a8b0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
a8c0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
a8d0: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
a8e0: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
a8f0: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
a900: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
a910: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
a920: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
a930: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
a940: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
a950: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
a960: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
a970: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
a980: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a990: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
a9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
a9b0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
a9c0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a9d0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
a9e0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
a9f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
aa00: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
aa10: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
aa20: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
aa30: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
aa40: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
aa50: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
aa60: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
aa70: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
aa80: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
aa90: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
aaa0: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
aab0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
aac0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
aad0: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
aae0: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
aaf0: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
ab00: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
ab10: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
ab20: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
ab30: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
ab40: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
ab50: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
ab60: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
ab70: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
ab80: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
ab90: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
aba0: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
abb0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
abc0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
abd0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
abe0: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
abf0: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
ac00: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
ac10: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
ac20: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
ac30: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ac40: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
ac50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
ac60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ac70: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ac80: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
ac90: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67  origDbSize==mxPg
aca0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
acb0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
acc0: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
acd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ace0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
acf0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
ad00: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
ad10: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
ad20: 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
ad30: 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74     /* rc = sqlit
ad40: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
ad50: 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48  ->jfd, JOURNAL_H
ad60: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20  DR_SZ(pPager)); 
ad70: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  */.    if( rc!=S
ad80: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
ad90: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
ada0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
adb0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
adc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
add0: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
ade0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
adf0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
ae00: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
ae10: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
ae20: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
ae30: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
ae40: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
ae50: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ae60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ae70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ae80: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
ae90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
aea0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
aeb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
aec0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
aed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
aee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aef0: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
af00: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
af10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
af20: 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74  .  /* Pages that
af30: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
af40: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
af50: 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63  l but never sync
af60: 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f  ed.  ** where no
af70: 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68  t restored by th
af80: 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57  e loop above.  W
af90: 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72  e have to restor
afa0: 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67  e those.  ** pag
afb0: 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  es by reading th
afc0: 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  em back from the
afd0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
afe0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  se..  */.  asser
aff0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
b000: 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f   );.  pager_relo
b010: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
b020: 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
b030: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b040: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b050: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
b060: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
b070: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
b080: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
b090: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
b0a0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
b0b0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
b0c0: 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20  rn true,.    ** 
b0d0: 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
b0e0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
b0f0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b100: 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a 20  al. If errors . 
b110: 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72 69     ** occur duri
b120: 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  ng this process,
b130: 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20 20   ignore them..  
b140: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
b150: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b160: 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73      pager_delmas
b170: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
b180: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
b190: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
b1a0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
b1b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
b1c0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
b1d0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
b1e0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
b1f0: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
b200: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
b210: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
b220: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
b230: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
b240: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
b250: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
b260: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
b270: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
b280: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
b290: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
b2a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b2b0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
b2c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b2d0: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
b2e0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
b2f0: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
b300: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
b310: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
b320: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
b330: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
b340: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
b350: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
b360: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
b370: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
b380: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
b390: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
b3a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
b3b0: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
b3c0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
b3d0: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
b3e0: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
b3f0: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
b400: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
b410: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
b420: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
b430: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
b440: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
b450: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
b460: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
b470: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
b480: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
b490: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b4a0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
b4b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b4c0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b4e0: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
b4f0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
b500: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
b510: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
b520: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b530: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
b540: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
b550: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b560: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
b570: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
b580: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
b590: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
b5a0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
b5b0: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
b5c0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b5d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  &pPager->jfd, &o
b5e0: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
b5f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b600: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
b610: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
b620: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
b630: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
b640: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
b650: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
b660: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
b670: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
b680: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
b690: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
b6a0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
b6b0: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
b6c0: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
b6d0: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
b6e0: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
b6f0: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
b700: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
b710: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
b720: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
b730: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
b740: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a 20 20   szJ;.  }.  ..  
b750: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
b760: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
b770: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
b780: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
b790: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
b7a0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
b7b0: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  tmtSize);.  pPag
b7c0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
b7d0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
b7e0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
b7f0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
b800: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
b810: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
b820: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
b830: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
b840: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
b850: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
b860: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
b870: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
b880: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
b890: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
b8a0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
b8b0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
b8c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b8d0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
b8e0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
b8f0: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
b900: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
b910: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
b920: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
b930: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
b940: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
b950: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
b960: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
b970: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
b980: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
b990: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
b9a0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
b9b0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
b9c0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
b9d0: 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  , &pPager->stfd,
b9e0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
b9f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
ba00: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
ba10: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
ba20: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
ba30: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
ba40: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
ba50: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
ba60: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
ba70: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
ba80: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
ba90: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
baa0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
bab0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
bac0: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
bad0: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
bae0: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
baf0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
bb00: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
bb10: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
bb20: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
bb30: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
bb40: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
bb50: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
bb60: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
bb70: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
bb80: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
bb90: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
bba0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
bbb0: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
bbc0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
bbd0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
bbe0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
bbf0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
bc00: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
bc10: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
bc20: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
bc30: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
bc40: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
bc50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
bc60: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
bc70: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
bc80: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
bc90: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
bca0: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
bcb0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
bcc0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
bcd0: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
bce0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
bcf0: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
bd00: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
bd10: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
bd20: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
bd30: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
bd40: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
bd50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
bd60: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
bd70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bd80: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
bd90: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
bda0: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
bdb0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bdc0: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
bdd0: 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20  2 nRec;.    u32 
bde0: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
bdf0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
be00: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
be10: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
be20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
be30: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
be40: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
be50: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
be60: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
be70: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
be80: 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nRec==0 ){.   
be90: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
bea0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
beb0: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
bec0: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
bed0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65   }.    for(i=nRe
bee0: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
bef0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
bf00: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
bf10: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
bf20: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
bf30: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
bf40: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
bf50: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
bf60: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
bf70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bf80: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
bf90: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
bfa0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
bfb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
bfc0: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
bfd0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
bfe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bff0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
c000: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
c010: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
c020: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c030: 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52  PT;  /* bkpt-COR
c040: 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  RUPT */.  }else{
c050: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
c060: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
c070: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
c080: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
c090: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
c0a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c0b0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
c0c0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
c0d0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
c0e0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
c0f0: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
c100: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
c110: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
c120: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
c130: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
c140: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
c150: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
c160: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
c170: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
c180: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
c190: 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  3OsSync().  The 
c1a0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
c1b0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
c1c0: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
c1d0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
c1e0: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
c1f0: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
c200: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
c210: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
c220: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
c230: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
c240: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
c250: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
c260: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
c270: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
c280: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
c290: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
c2a0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
c2b0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
c2c0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
c2d0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
c2e0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c2f0: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
c300: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a  >needSync = 0; .
c310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
c320: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
c330: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
c340: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
c350: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
c360: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
c370: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
c380: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
c390: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
c3a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
c3b0: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
c3c0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c3d0: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
c3e0: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
c3f0: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
c400: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
c410: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
c420: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
c430: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
c440: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
c450: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
c460: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
c470: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
c480: 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
c490: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
c4a0: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
c4c0: 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
c4d0: 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
c4e0: 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
c4f0: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
c500: 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
c510: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
c520: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
c530: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
c540: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
c550: 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
c560: 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
c580: 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
c590: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
c5a0: 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
c5b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c5c0: 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
c5d0: 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
c5e0: 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
c5f0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c600: 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
c610: 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
c620: 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
c630: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
c650: 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
c660: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
c670: 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
c680: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
c690: 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
c6a0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
c6b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c6c0: 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
c6d0: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
c6e0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
c6f0: 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
c710: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
c720: 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
c730: 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
c740: 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
c750: 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
c760: 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
c770: 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
c780: 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
c790: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
c7a0: 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
c7b0: 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
c7c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c7d0: 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
c7e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
c7f0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
c800: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
c810: 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
c820: 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
c830: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c840: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
c850: 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
c860: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
c870: 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
c880: 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
c890: 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
c8a0: 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20  FULL=3..*/.void 
c8b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
c8c0: 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61  _safety_level(Pa
c8d0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
c8e0: 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65   level){.  pPage
c8f0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
c900: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
c910: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
c920: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
c930: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
c940: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
c950: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
c960: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
c970: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  edSync = 0;.}../
c980: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
c990: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69  orary file.  Wri
c9a0: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  te the name of t
c9b0: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61  he file into zNa
c9c0: 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73  me.** (zName mus
c9d0: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51  t be at least SQ
c9e0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
c9f0: 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20  ZE bytes long.) 
ca00: 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69   Write.** the fi
ca10: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
ca20: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
ca30: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
ca40: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
ca50: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
ca60: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
ca70: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
ca80: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
ca90: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
caa0: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
cab0: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
cac0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
cad0: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
cae0: 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73  (char *zFile, Os
caf0: 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74  File *fd){.  int
cb00: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
cb10: 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  rc;.  do{.    cn
cb20: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
cb30: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
cb40: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
cb50: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
cb60: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
cb70: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
cb80: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
cb90: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
cba0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
cbb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cbc0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
cbd0: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
cbe0: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
cbf0: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
cc00: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
cc10: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
cc20: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
cc30: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
cc40: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
cc50: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
cc60: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
cc70: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
cc80: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
cc90: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
cca0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
ccb0: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
ccc0: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
ccd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
cce0: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
ccf0: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
cd00: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
cd10: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
cd20: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
cd30: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
cd40: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
cd50: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
cd60: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
cd70: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
cd80: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
cd90: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
cda0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
cdb0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
cdc0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
cdd0: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
cde0: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
cdf0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
ce00: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
ce10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
ce20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ce30: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
ce40: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
ce50: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
ce60: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
ce70: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
ce80: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
ce90: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
cea0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ceb0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
cec0: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
ced0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
cee0: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
cef0: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
cf00: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
cf10: 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20  useJournal      
cf20: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20       /* TRUE to 
cf30: 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  use a rollback j
cf40: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
cf50: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
cf60: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
cf70: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
cf80: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
cf90: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
cfa0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
cfb0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
cfc0: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
cfd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
cfe0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
cff0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  Only = 0;.  char
d000: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
d010: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
d020: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
d030: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
d040: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69  sizeof(fd));.  i
d050: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
d060: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
d070: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d080: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
d090: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
d0a0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
d0b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d0c0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
d0d0: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
d0e0: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
d0f0: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
d100: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
d110: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
d120: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
d130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
d140: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  K;.    }else.#en
d150: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
d160: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
d170: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
d180: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
d190: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
d1a0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
d1b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d1c0: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
d1d0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
d1e0: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
d1f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d200: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
d210: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
d220: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
d230: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
d240: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
d250: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d260: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d270: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
d280: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d2a0: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
d2b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a    }.  }.  if( !z
d2c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
d2d0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
d2e0: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74  se(&fd);.    ret
d2f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
d310: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d320: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
d330: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
d340: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
d350: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d360: 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  rc;.  }.  nameLe
d370: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
d380: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
d390: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
d3a0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
d3b0: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
d3c0: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
d3d0: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
d3e0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
d3f0: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
d400: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
d410: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d420: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d430: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25    TRACE3("OPEN %
d440: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
d450: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
d460: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
d470: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
d480: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
d490: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
d4a0: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
d4b0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
d4c0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
d4d0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
d4e0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
d4f0: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
d500: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
d510: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
d520: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
d530: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
d540: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
d550: 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  hname);.  for(i=
d560: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
d570: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
d580: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
d590: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
d5a0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
d5b0: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
d5c0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
d5d0: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
d5e0: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
d5f0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
d600: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
d610: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
d620: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
d630: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
d640: 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f  ->fd = fd;.#if O
d650: 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d  S_UNIX.  pPager-
d660: 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61  >fd.pPager = pPa
d670: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  ger;.#endif.  pP
d680: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d690: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
d6a0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
d6b0: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
d6c0: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  Db;.  pPager->st
d6d0: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  mtOpen = 0;.  pP
d6e0: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d6f0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d700: 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Ref = 0;.  pPage
d710: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
d720: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
d730: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
d740: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
d750: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73  ZE;.  pPager->ps
d760: 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f  Aligned = FORCE_
d770: 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
d780: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 70  ->pageSize);.  p
d790: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
d7a0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
d7b0: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20  tmtJSize = 0;.  
d7c0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
d7d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
d7e0: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
d7f0: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
d800: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
d810: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
d820: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
d830: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
d840: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
d850: 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
d860: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
d870: 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65  eadOnly;.  pPage
d880: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d890: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
d8a0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
d8b0: 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
d8c0: 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
d8d0: 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
d8e0: 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
d8f0: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
d900: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d910: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
d920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
d930: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
d940: 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
d950: 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
d960: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  );.  pPager->sec
d970: 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f  torSize = PAGER_
d980: 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70  SECTOR_SIZE;.  p
d990: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
d9a0: 6c 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  ler = 0;.  memse
d9b0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
d9c0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
d9d0: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
d9e0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
d9f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
da00: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
da10: 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
da20: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
da30: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
da40: 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65  r_set_busyhandle
da50: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
da60: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
da70: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
da80: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
da90: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
daa0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
dab0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
dac0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
dad0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
dae0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
daf0: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
db00: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
db10: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
db20: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
db30: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
db40: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
db50: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
db60: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
db70: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
db80: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
db90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
dba0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
dbb0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
dbc0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
dbd0: 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
dbe0: 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
dbf0: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
dc00: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
dc10: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
dc20: 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63  ager_set_destruc
dc30: 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
dc40: 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
dc50: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20  (void*,int)){.  
dc60: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
dc70: 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
dc80: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
dc90: 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
dca0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
dcb0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
dcc0: 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
dcd0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
dce0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
dcf0: 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
dd00: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
dd10: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
dd20: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
dd30: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
dd40: 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
dd50: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
dd60: 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
dd70: 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
dd80: 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
dd90: 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
dda0: 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
ddb0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
ddc0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ddd0: 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67  set_reiniter(Pag
dde0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ddf0: 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64   (*xReinit)(void
de00: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
de10: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
de20: 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
de30: 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
de40: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ze..**.** The pa
de50: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 6f 6e 6c  ge size must onl
de60: 79 20 62 65 20 63 68 61 6e 67 65 64 20 77 68 65  y be changed whe
de70: 6e 20 74 68 65 20 63 61 63 68 65 20 69 73 20 65  n the cache is e
de80: 6d 70 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mpty..*/.void sq
de90: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70  lite3pager_set_p
dea0: 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
deb0: 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
dec0: 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
ded0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
dee0: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
def0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
df00: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  );.  pPager->pag
df10: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
df20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41 6c  ;.  pPager->psAl
df30: 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c  igned = FORCE_AL
df40: 49 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a 65  IGNMENT(pageSize
df50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
df60: 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
df70: 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
df80: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
df90: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
dfa0: 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
dfb0: 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72  ts to.  No error
dfc0: 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
dfd0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
dfe0: 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c  e3pager_read_fil
dff0: 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
e000: 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
e010: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
e020: 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44  st){.  memset(pD
e030: 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
e040: 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
e050: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
e060: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  &pPager->fd, 0);
e070: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
e080: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
e090: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d  pDest, N);.  }.}
e0a0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e0b0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
e0c0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
e0d0: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
e0e0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
e0f0: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
e100: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
e110: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
e120: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
e130: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
e140: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e150: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
e160: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
e170: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  >dbSize;.  }.  i
e180: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
e190: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
e1a0: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
e1b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e1c0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
e1d0: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
e1e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
e1f0: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
e200: 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Size;.  if( !MEM
e210: 44 42 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47  DB && n==PENDING
e220: 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
e230: 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b  geSize ){.    n+
e240: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  +;.  }.  if( pPa
e250: 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
e260: 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
e270: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
e280: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
e290: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72   n;.}../*.** For
e2a0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
e2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
e2c0: 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
e2d0: 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  *);.../*.** Unli
e2e0: 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
e2f0: 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
e300: 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
e310: 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
e320: 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
e330: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
e340: 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
e350: 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
e360: 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
e370: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
e380: 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72  ger_movepage() r
e390: 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
e3a0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
e3b0: 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
e3c0: 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
e3d0: 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
e3e0: 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
e3f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e400: 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
e410: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e420: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
e430: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
e440: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
e450: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
e460: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
e470: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61  page is not in a
e480: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a  ny hash chain. *
e490: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
e4a0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
e4b0: 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
e4c0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
e4d0: 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
e4e0: 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
e4f0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
e500: 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
e510: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
e520: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
e530: 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20  pgno)]!=pPg );. 
e540: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
e550: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
e560: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
e570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
e580: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
e590: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
e5a0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
e5b0: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
e5c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
e5d0: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
e5e0: 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50  tHash;.  }..  pP
e5f0: 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
e600: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
e610: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
e620: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
e630: 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
e640: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
e650: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
e660: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
e670: 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
e680: 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
e690: 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
e6a0: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
e6b0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
e6c0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e6d0: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
e6e0: 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70  .  /* Keep the p
e6f0: 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e  FirstSynced poin
e700: 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ter pointing at 
e710: 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72  the first synchr
e720: 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20  onized page */. 
e730: 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
e740: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
e750: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
e760: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
e770: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
e780: 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
e790: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
e7a0: 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ; }.    pPager->
e7b0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
e7c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
e7d0: 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  nk from the free
e7e0: 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50  list */.  if( pP
e7f0: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
e800: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
e810: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
e820: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
e840: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
e850: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
e860: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
e870: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
e880: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
e890: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
e8a0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
e8b0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
e8c0: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
e8d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
e8e0: 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
e8f0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
e900: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
e910: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a  >pPrevFree;.  }.
e920: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
e930: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
e940: 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  e = 0;..  /* Unl
e950: 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
e960: 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
e970: 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
e980: 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
e990: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
e9a0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
e9b0: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
e9c0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
e9d0: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
e9e0: 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
e9f0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
ea00: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
ea10: 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
ea20: 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
ea30: 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
ea40: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
ea50: 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
ea60: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
ea70: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
ea80: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ea90: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
eaa0: 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
eab0: 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
eac0: 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
ead0: 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
eae0: 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
eaf0: 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
eb00: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
eb10: 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
eb20: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
eb30: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
eb40: 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
eb50: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
eb60: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
eb70: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
eb80: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
eb90: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
eba0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
ebb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
ebc0: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
ebd0: 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
ebe0: 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
ebf0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
ec00: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
ec10: 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
ec20: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  }.}../*.** Trunc
ec30: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
ec40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ec50: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
ec60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
ec70: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
ec80: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
ec90: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
eca0: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
ecb0: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
ecc0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
ecd0: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
ece0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
ecf0: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
ed00: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ed10: 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
ed20: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
ed30: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
ed40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ed50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
ed60: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
ed70: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
ed80: 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
ed90: 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
eda0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
edb0: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
edc0: 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
edd0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ede0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
edf0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
ee00: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
ee10: 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
ee20: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
ee30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
ee40: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
ee50: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
ee60: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ee70: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
ee80: 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
ee90: 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
eea0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
eeb0: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
eec0: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
eed0: 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
eee0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
eef0: 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
ef00: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
ef10: 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
ef20: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
ef30: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
ef40: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
ef50: 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
ef60: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
ef70: 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
ef80: 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
ef90: 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
efa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
efb0: 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
efc0: 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
efd0: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
efe0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
eff0: 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
f000: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
f010: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69  g, *pNext;.  swi
f020: 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
f030: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
f040: 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20  AGER_RESERVED:. 
f050: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59     case PAGER_SY
f060: 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20  NCED: .    case 
f070: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a  PAGER_EXCLUSIVE:
f080: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f090: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
f0a0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
f0b0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
f0c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
f0d0: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
f0e0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
f0f0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
f100: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f110: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
f120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f130: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
f140: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
f150: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
f160: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
f170: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
f180: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
f190: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f1a0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f1b0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
f1c0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
f1d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f1e0: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
f1f0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
f200: 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64  Pg=pNext){.#ifnd
f210: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66  ef NDEBUG.    if
f220: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
f230: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
f240: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
f250: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
f260: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f270: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
f280: 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
f290: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
f2a0: 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
f2b0: 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
f2c0: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
f2d0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
f2e0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
f2f0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
f300: 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
f310: 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
f320: 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
f330: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
f340: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61  pPager->fd);.  a
f350: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f360: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
f370: 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
f380: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
f390: 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
f3a0: 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
f3b0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
f3c0: 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
f3d0: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
f3e0: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
f3f0: 2a 20 7d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  * }.  */.  if( p
f400: 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
f410: 21 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  !=(char*)&pPager
f420: 5b 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [1] ){.    asser
f430: 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
f440: 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20  ot happen */.   
f450: 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
f460: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
f470: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f480: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
f490: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f4a0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
f4b0: 6f 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ory);.  }.  sqli
f4c0: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
f4d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f4e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
f4f0: 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
f500: 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
f510: 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
f520: 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
f530: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
f540: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
f550: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
f560: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
f570: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
f580: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
f590: 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
f5a0: 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
f5b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
f5c0: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
f5d0: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
f5e0: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
f5f0: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
f600: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
f610: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
f620: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
f630: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
f640: 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
f650: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
f660: 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
f670: 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
f680: 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
f690: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
f6a0: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
f6b0: 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
f6c0: 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
f6d0: 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
f6e0: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
f6f0: 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
f700: 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
f710: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
f720: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
f730: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
f740: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
f750: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
f760: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
f770: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
f780: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
f790: 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
f7a0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
f7b0: 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
f7c0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
f7d0: 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
f7e0: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
f7f0: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
f800: 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
f810: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
f820: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
f830: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
f840: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
f850: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
f860: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
f870: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
f880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f890: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
f8a0: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
f8b0: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
f8c0: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
f8d0: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
f8e0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
f8f0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
f900: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
f910: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
f920: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
f930: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
f940: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
f950: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
f960: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
f970: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
f980: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f990: 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f  TEST.  static vo
f9a0: 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
f9b0: 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
f9c0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
f9d0: 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
f9e0: 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
f9f0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
fa00: 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
fa10: 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
fa20: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
fa30: 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
fa40: 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
fa50: 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
fa60: 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
fa70: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
fa80: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
fa90: 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
faa0: 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
fab0: 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
fac0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
fad0: 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
fae0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
faf0: 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
fb00: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
fb10: 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
fb20: 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
fb30: 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
fb40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fb50: 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
fb60: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
fb70: 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
fb80: 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
fb90: 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
fba0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
fbb0: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
fbc0: 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
fbd0: 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
fbe0: 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
fbf0: 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
fc00: 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
fc10: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
fc20: 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
fc30: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
fc40: 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
fc50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
fc60: 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
fc70: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
fc80: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
fc90: 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
fca0: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
fcb0: 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
fcc0: 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
fcd0: 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
fce0: 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
fcf0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
fd00: 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
fd10: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
fd20: 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
fd30: 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
fd40: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
fd50: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
fd60: 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
fd70: 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
fd80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
fd90: 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
fda0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
fdb0: 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
fdc0: 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
fdd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
fde0: 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
fdf0: 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
fe00: 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
fe10: 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
fe20: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
fe30: 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
fe40: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
fe50: 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
fe60: 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
fe70: 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
fe80: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
fe90: 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
fea0: 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
feb0: 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
fec0: 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
fed0: 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
fee0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
fef0: 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
ff00: 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
ff10: 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
ff20: 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
ff30: 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
ff40: 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
ff50: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
ff60: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
ff70: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
ff80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
ff90: 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
ffa0: 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
ffb0: 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
ffc0: 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
ffd0: 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
ffe0: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
fff0: 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
10000 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
10010 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
10020 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
10030 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
10040 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
10050 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10060 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
10070 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
10080 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
10090 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
100a0 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
100b0 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
100c0 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
100d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
100e0 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
100f0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
10100 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
10110 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
10120 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
10130 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
10140 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
10150 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
10160 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
10170 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
10180 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
10190 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
101a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
101b0 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
101c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
101d0 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
101e0 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
101f0 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
10200 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
10210 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10220 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20  journalOff==jSz 
10230 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
10240 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
10250 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
10260 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
10270 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10280 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
10290 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
102a0 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
102b0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
102c0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
102d0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
102e0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
102f0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
10300 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
10310 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
10320 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
10330 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
10340 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20  e for rollback. 
10350 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10360 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10370 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
10380 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
10390 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
103a0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
103b0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
103c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
103d0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
103e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
103f0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
10400 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
10410 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
10420 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
10430 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
10440 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
10450 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
10460 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
10470 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
10480 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
10490 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
104a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
104b0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
104c0 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
104d0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
104e0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
104f0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
10500 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
10510 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
10520 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
10530 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
10540 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
10550 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
10560 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
10570 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
10580 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
10590 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
105a0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
105b0 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
105c0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
105d0 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
105e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
105f0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
10600 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
10610 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
10620 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
10630 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
10640 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10650 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
10660 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
10670 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
10680 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
10690 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
106a0 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
106b0 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
106c0 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
106d0 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
106e0 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
106f0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
10700 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
10710 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
10720 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
10730 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
10740 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
10750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10760 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
10770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
10780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
10790 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
107a0 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
107b0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
107c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
107d0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c  ry to obtain a l
107e0 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20  ock on a file.  
107f0 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
10800 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20  callback if the 
10810 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65  lock.** is curre
10820 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62  ntly not availab
10830 6c 65 2e 20 20 52 65 70 65 61 74 65 20 75 6e 74  le.  Repeate unt
10840 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  il the busy call
10850 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20  back returns.** 
10860 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74  false or until t
10870 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73  he lock succeeds
10880 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10890 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
108a0 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ess and an error
108b0 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e   code if we cann
108c0 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65  ot obtain.** the
108d0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   lock..*/.static
108e0 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
108f0 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
10900 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
10910 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ype){.  int rc;.
10920 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
10930 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
10940 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
10950 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
10960 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
10970 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
10980 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
10990 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
109a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
109b0 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
109c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
109d0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
109e0 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20   int busy = 1;. 
109f0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
10a00 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
10a10 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f  (&pPager->fd, lo
10a20 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68  cktype);.    }wh
10a30 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
10a40 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20  BUSY && .       
10a50 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
10a60 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20  ndler && .      
10a70 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10a80 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26  andler->xFunc &&
10a90 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10aa0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10ab0 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42  xFunc(pPager->pB
10ac0 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67  usyHandler->pArg
10ad0 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b  , busy++).    );
10ae0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10af0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10b00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
10b10 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a  locktype;.    }.
10b20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
10b30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
10b40 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
10b50 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
10b60 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
10b70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
10b80 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
10b90 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
10ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10bb0 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
10bc0 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
10bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10be0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
10bf0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
10c00 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
10c10 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
10c20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
10c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10c40 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c  K;.  pPager = pL
10c50 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  ist->pPager;..  
10c60 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10c70 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69   there may be ei
10c80 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20  ther a RESERVED 
10c90 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
10ca0 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  k on the.  ** da
10cb0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
10cc0 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
10cd0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
10ce0 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ck, the followin
10cf0 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  g.  ** calls to 
10d00 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20  sqlite3OsLock() 
10d10 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a  are no-ops..  **
10d20 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
10d30 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
10d40 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
10d50 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
10d60 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
10d70 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
10d80 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
10d90 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
10da0 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
10db0 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
10dc0 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
10dd0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
10de0 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
10df0 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
10e00 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
10e10 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
10e20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
10e30 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
10e40 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
10e50 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
10e60 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
10e70 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
10e80 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
10e90 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
10ea0 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
10eb0 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
10ec0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
10ed0 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
10ee0 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
10ef0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
10f00 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
10f10 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
10f20 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
10f30 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
10f40 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
10f50 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
10f60 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
10f70 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
10f80 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
10f90 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
10fa0 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
10fb0 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
10fc0 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
10fd0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
10fe0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
10ff0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
11000 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
11010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
11020 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
11030 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b   while( pList ){
11040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
11050 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  st->dirty );.   
11060 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
11070 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69  pPager->fd, (pLi
11080 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
11090 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
110a0 65 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  e);.    /* If th
110b0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
110c0 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
110d0 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
110e0 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
110f0 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
11100 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
11110 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65  eans sqlite3page
11120 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73  r_truncate() was
11130 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
11140 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
11150 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
11160 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
11170 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
11180 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
11190 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
111a0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  the file..    */
111b0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e  .    if( pList->
111c0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62  pgno<=pPager->db
111d0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f  Size ){.      CO
111e0 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44  DEC(pPager, PGHD
111f0 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
11200 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
11210 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
11220 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
11230 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
11240 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
11250 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
11260 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
11270 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
11280 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
11290 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
112a0 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  ze);.      CODEC
112b0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
112c0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
112d0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a  List->pgno, 0);.
112e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
112f0 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
11300 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53       TRACE3("NOS
11310 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
11320 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11330 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
11340 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
11350 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
11360 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
11370 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  t->dirty = 0;.  
11380 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
11390 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
113a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
113b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
113c0 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
113d0 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
113e0 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
113f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11400 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
11410 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
11420 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
11430 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
11440 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
11450 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
11460 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
11470 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
11480 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
11490 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b  gHdr *p, *pList;
114a0 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  .  pList = 0;.  
114b0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
114c0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
114d0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
114e0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
114f0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69   p->pDirty = pLi
11500 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  st;.      pList 
11510 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = p;.    }.  }. 
11520 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
11530 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
11540 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
11550 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
11560 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
11570 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
11580 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
11590 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
115a0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
115b0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
115c0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
115d0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67  ased..**.** A _g
115e0 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  et works for any
115f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
11600 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
11610 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
11620 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
11630 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
11640 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
11650 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
11660 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
11670 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
11680 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
11690 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
116a0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
116b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
116c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
116d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
116e0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
116f0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
11700 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
11710 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
11720 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
11730 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
11740 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
11750 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
11760 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
11770 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
11780 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
11790 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
117a0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
117b0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
117c0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
117d0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
117e0 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
117f0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
11800 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
11810 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
11820 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
11830 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
11840 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
11850 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
11860 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
11870 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
11880 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
11890 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
118b0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
118c0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
118d0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
118e0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
118f0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
11900 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
11910 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
11920 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
11930 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
11940 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
11950 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
11960 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
11970 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
11980 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11990 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
119a0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
119b0 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
119c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
119d0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  t rc;..  /* Make
119e0 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
119f0 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
11a00 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
11a10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a20 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
11a30 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a  ( pgno!=0 );.  *
11a40 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  ppPage = 0;.  if
11a50 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
11a60 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
11a70 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
11a80 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
11a90 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  e(pPager);.  }..
11aa0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
11ab0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
11ac0 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
11ad0 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
11ae0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
11af0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
11b00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
11b10 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
11b20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
11b30 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11b40 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
11b50 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  CK);.    if( rc!
11b60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11b70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11b80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
11b90 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
11ba0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
11bb0 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
11bc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
11bd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11be0 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
11bf0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
11c00 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
11c10 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
11c20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
11c30 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20  ournal && .     
11c40 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
11c50 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
11c60 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20  Journal) &&.    
11c70 20 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68      !sqlite3OsCh
11c80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
11c90 26 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  &pPager->fd) .  
11ca0 20 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20    ){.       int 
11cb0 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
11cc0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
11cd0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
11ce0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
11cf0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
11d00 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
11d10 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
11d20 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
11d30 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
11d40 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
11d50 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
11d60 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
11d70 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
11d80 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
11d90 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
11da0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
11db0 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
11dc0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
11dd0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
11de0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
11df0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
11e00 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
11e10 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
11e20 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
11e30 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
11e40 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
11e50 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
11e60 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
11e70 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
11e80 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
11e90 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
11ea0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
11eb0 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
11ec0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
11ed0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
11ee0 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
11ef0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
11f00 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
11f10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
11f20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
11f30 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  &pPager->fd, EXC
11f40 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
11f50 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
11f60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11f70 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
11f80 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
11f90 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
11fa0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
11fb0 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
11fc0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
11fd0 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
11fe0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
11ff0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
12000 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  SIVE;..       /*
12010 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
12020 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
12030 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
12040 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
12050 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
12060 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
12070 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
12080 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a       **.       *
12090 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
120a0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
120b0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
120c0 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
120d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
120e0 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
120f0 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
12100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
12110 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20  lds.       ** a 
12120 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
12130 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
12140 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
12150 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a  or more.       *
12160 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e  * processes open
12170 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
12180 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
12190 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
121a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
121b0 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50  sOpenReadOnly(pP
121c0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
121d0 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
121e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
121f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12200 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
12210 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
12220 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
12230 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12240 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
12250 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
12260 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
12280 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12290 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70  en = 1;.       p
122a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
122b0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
122c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
122d0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
122e0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
122f0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  er = 0;.       p
12300 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12310 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  r = 0;..       /
12320 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
12330 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
12340 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
12350 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
12360 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
12370 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
12380 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
12390 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
123a0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
123b0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
123c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
123d0 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
123e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
123f0 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30     }.    pPg = 0
12400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12410 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67  * Search for pag
12420 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  e in cache */.  
12430 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
12440 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
12450 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  o);.    if( MEMD
12460 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  B && pPager->sta
12470 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
12480 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12490 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
124a0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
124b0 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
124c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
124d0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
124e0 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
124f0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
12500 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   h;.    pPager->
12510 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28  nMiss++;.    if(
12520 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
12530 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
12540 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
12550 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
12560 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
12570 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
12580 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
12590 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
125a0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
125b0 3e 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20  >psAligned.     
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
125e0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
125f0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
12620 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
12630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
12640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
12650 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
12660 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77         pager_unw
12670 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
12680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12690 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
126a0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
126b0 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
126c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
126d0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
126e0 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
126f0 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
12700 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
12710 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
12720 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
12730 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
12740 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
12750 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
12760 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
12770 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
12780 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
12790 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
127a0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
127b0 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
127c0 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
127d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
127e0 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
127f0 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
12800 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
12810 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  hat does not.   
12820 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73     ** require us
12830 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
12840 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
12850 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12860 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
12870 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
12880 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75      /* If we cou
12890 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
128a0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
128b0 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
128c0 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  c().      ** on 
128d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
128e0 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
128f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
12900 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a  his is a.      *
12910 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
12920 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
12930 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
12940 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
12950 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  es.      ** it c
12960 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
12970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
12980 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
12990 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
129a0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
129b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
129c0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
129d0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
129e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
129f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12a00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
12a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12a20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
12a30 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
12a40 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
12a50 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
12a60 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
12a70 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
12a80 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ..  ** journal f
12a90 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
12aa0 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
12ab0 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
12ac0 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72  nal..  ** header
12ad0 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
12ae0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
12af0 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
12b00 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61  have..  ** alrea
12b10 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
12b20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12b30 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
12b40 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61  der is..  ** tra
12b50 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
12b60 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12b70 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ted)..          
12b80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  */.          pPa
12b90 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
12ba0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
12bb0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12bc0 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
12bd0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
12be0 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
12bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
12c00 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
12c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12c20 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12c30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
12c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12c50 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20  OERR;.          
12c60 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
12c70 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
12c80 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
12c90 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
12ca0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
12cb0 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
12cc0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
12cd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
12ce0 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
12cf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
12d00 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
12d10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12d20 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
12d30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  );.        pPg->
12d40 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
12d50 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
12d60 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
12d70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Pg );.        if
12d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12da0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
12db0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12dc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12dd0 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
12de0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12df0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
12e00 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  dirty==0 );..   
12e10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
12e20 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
12e30 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
12e40 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
12e50 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65  then.      ** se
12e60 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
12e70 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
12e80 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
12e90 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
12ea0 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
12eb0 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
12ec0 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
12ed0 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
12ee0 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  on..      ** It 
12ef0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
12f00 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
12f10 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
12f20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
12f30 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65       ** might be
12f40 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
12f50 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
12f60 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
12f70 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
12f80 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77      ** that is w
12f90 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
12fa0 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
12fb0 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
12fc0 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20  ages must.      
12fd0 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
12fe0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
12ff0 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
13000 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13010 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
13020 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
13030 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
13040 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
13050 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13060 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
13070 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
13080 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
13090 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20  hash table.     
130a0 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b   */.      unlink
130b0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
130c0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b   pPager->nOvfl++
130d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
130e0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
130f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
13100 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
13110 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
13120 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
13130 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
13140 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
13150 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
13160 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13170 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13180 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
13190 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
131a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
131b0 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
131c0 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
131d0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
131e0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
131f0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
13200 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13210 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
13220 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
13230 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
13240 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e  Stmt && (int)pgn
13250 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
13260 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
13270 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e   && (pPager->aIn
13280 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  Stmt[pgno/8] & (
13290 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
132a0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61   ){.      page_a
132b0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
132c0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
132d0 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f  .      page_remo
132e0 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
132f0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
13300 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
13310 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
13320 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
13330 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65  (pPg);.    pPage
13340 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68  r->nRef++;.    h
13350 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
13360 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  no);.    pPg->pN
13370 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
13380 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
13390 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
133a0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
133b0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
133c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
133d0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
133e0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
133f0 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
13400 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
13410 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
13420 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
13430 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
13440 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
13450 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
13460 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
13470 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
13480 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
13490 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
134a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
134b0 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
134c0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
134d0 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
134e0 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
134f0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
13500 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
13510 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13520 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13530 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
13540 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
13550 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
13560 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
13570 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
13580 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13590 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
135a0 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
135b0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
135c0 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
135d0 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
135e0 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
135f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
13600 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26   sqlite3OsRead(&
13610 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
13620 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
13630 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13640 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
13650 22 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  "FETCH %d page %
13660 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
13670 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
13680 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
13690 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
136a0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
136b0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20  pgno, 3);.      
136c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  K ){.        i64
136e0 20 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20   fileSize;.     
136f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
13700 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
13710 2d 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21  ->fd,&fileSize)!
13720 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20  =SQLITE_OK.     
13730 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c            || fil
13740 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67  eSize>=pgno*pPag
13750 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
13760 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13770 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48  3pager_unref(PGH
13780 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
13790 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
137a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
137b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
137c0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
137d0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
137e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
137f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
13810 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
13820 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
13830 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13840 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
13850 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67  >nHit++;.    pag
13860 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
13870 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
13880 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
13890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
138a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
138b0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
138c0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
138d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
138e0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
138f0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
13900 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
13910 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
13920 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
13930 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
13940 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
13950 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
13960 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20  te3pager_get(). 
13970 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
13980 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
13990 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
139a0 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69  te3pager_get() i
139b0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
139c0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
139d0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
139e0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
139f0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
13a00 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
13a10 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
13a20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
13a30 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
13a40 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
13a50 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
13a60 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
13a70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
13a80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
13a90 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
13aa0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
13ab0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
13ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
13ad0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13ae0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  gno!=0 );.  if( 
13af0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
13b00 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
13b10 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
13b20 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
13b30 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
13b40 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
13b50 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
13b60 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
13b70 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
13b80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
13b90 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  g);.}../*.** Rel
13ba0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
13bb0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
13bc0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
13bd0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
13be0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
13bf0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
13c00 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
13c10 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
13c20 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
13c30 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
13c40 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
13c50 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
13c60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13c70 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
13c80 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
13c90 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76  te3pager_unref(v
13ca0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
13cb0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
13cc0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
13cd0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
13ce0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
13cf0 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54  /.  pPg = DATA_T
13d00 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
13d10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13d20 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
13d30 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
13d40 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  O(pPg);..  /* Wh
13d50 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
13d60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
13d70 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
13d80 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
13d90 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
13da0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
13db0 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
13dc0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
13dd0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
13de0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
13df0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
13e00 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
13e10 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
13e20 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
13e30 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
13e40 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
13e50 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
13e60 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
13e70 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
13e80 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
13e90 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
13ea0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
13eb0 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
13ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
13ed0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
13ee0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13ef0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
13f00 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
13f10 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
13f20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
13f30 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
13f40 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
13f50 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
13f60 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
13f70 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
13f80 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
13f90 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
13fa0 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
13fb0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
13fc0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
13fd0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
13fe0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
13ff0 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
14000 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
14010 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
14020 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
14030 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
14040 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14050 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
14060 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14070 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
14080 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
14090 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
140a0 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
140b0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
140c0 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
140d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
140e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
140f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
14100 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
14110 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14120 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
14130 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
14140 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
14150 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
14160 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
14170 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
14180 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14190 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
141a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
141b0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
141c0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
141d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
141e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
141f0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
14200 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14210 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
14220 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
14230 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69  ournal );.  sqli
14240 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
14250 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
14260 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14270 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
14280 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
14290 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
142a0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
142b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
142c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
142d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
142e0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
142f0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14300 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
14310 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
14320 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
14330 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
14340 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
14350 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14360 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
14370 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
14380 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
14390 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
143a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
143b0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
143c0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73  journal;.  }.  s
143d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
143e0 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44  ctory(pPager->zD
143f0 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65  irectory, &pPage
14400 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65  r->jfd);.  pPage
14410 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
14420 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
14430 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
14440 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
14450 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
14460 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
14470 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
14480 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
14490 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
144a0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
144b0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
144c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
144d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
144e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
144f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
14500 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
14510 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
14520 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
14530 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
14540 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14550 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14560 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
14570 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
14580 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
145a0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
145b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
145c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
145d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
145e0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
145f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14600 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
14610 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
14620 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
14630 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
14640 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
14650 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nal = 0;.  sqlit
14660 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
14670 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
14680 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
14690 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
146a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
146b0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
146c0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
146d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
146e0 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
146f0 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
14700 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
14710 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
14720 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
14730 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
14740 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
14750 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14760 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
14770 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
14780 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
14790 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
147a0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
147b0 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
147c0 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
147d0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
147e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
147f0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
14800 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
14810 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
14820 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
14830 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
14840 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
14850 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
14860 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
14870 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
14880 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
14890 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
148a0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
148b0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
148c0 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
148d0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
148e0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
148f0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
14900 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
14910 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
14920 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
14930 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
14940 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
14950 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
14960 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
14970 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
14980 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
14990 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
149a0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
149b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
149c0 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
149d0 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
149e0 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
149f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
14a00 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
14a10 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
14a20 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
14a30 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
14a40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
14a50 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
14a60 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
14a70 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
14a80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14a90 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
14aa0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
14ab0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
14ac0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
14ad0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
14ae0 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
14af0 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
14b00 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
14b10 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
14b20 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
14b30 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
14b40 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
14b50 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
14b60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
14b70 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  in(void *pData, 
14b80 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
14b90 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
14ba0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
14bb0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14bc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
14bd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14be0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
14bf0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
14c00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14c10 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
14c20 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
14c30 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
14c40 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
14c50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14c60 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
14c70 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
14c80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
14c90 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14ca0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
14cb0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
14cc0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
14cd0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
14ce0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
14cf0 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
14d00 4c 4f 43 4b 20 7c 7c 20 65 78 46 6c 61 67 20 29  LOCK || exFlag )
14d10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
14d20 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
14d30 6b 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  k(pPager, RESERV
14d40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
14d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14d60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
14d70 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  k(&pPager->fd, R
14d80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
14d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14db0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
14dc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14dd0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
14de0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
14df0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
14e00 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
14e10 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
14e20 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
14e30 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14e40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14e50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14e70 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
14e80 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
14e90 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
14ea0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
14eb0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14ec0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
14ed0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14ee0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
14ef0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
14f00 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
14f10 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
14f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
14f50 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
14f60 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
14f70 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
14f80 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
14f90 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
14fa0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
14fb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
14fc0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
14fd0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
14fe0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
14ff0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15000 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
15010 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
15020 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
15030 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
15040 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
15050 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
15060 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
15070 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
15080 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
15090 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
150a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
150b0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
150c0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
150d0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
150e0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
150f0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
15100 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
15110 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
15120 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
15130 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15140 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
15150 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
15160 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
15170 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
15180 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
15190 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
151a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
151b0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
151c0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
151d0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
151e0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
151f0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
15200 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
15210 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
15220 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
15230 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
15240 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
15250 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15260 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
15270 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15280 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
15290 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
152a0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
152b0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
152c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
152d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
152e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
152f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
15300 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
15310 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
15320 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
15330 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
15340 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
15350 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
15360 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
15370 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
15380 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
15390 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
153a0 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  ter );..  /* Mar
153b0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
153c0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
153d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
153e0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
153f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
15400 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
15410 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
15420 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
15430 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
15440 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
15450 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
15460 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
15470 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
15480 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
15490 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
154a0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
154b0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
154c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
154d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
154e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
154f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
15500 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
15510 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
15520 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
15530 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
15540 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
15550 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
15560 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
15570 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
15580 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
15590 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
155a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
155b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
155c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
155d0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
155e0 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b  begin(pData, 0);
155f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15610 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15630 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
15640 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
15650 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
15660 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
15670 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
15680 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
15690 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
156a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
156b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
156c0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
156d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
156e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
156f0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
15700 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
15710 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
15720 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
15730 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
15740 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
15750 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
15760 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
15770 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
15780 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
15790 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
157a0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
157b0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
157c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
157d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
157e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
157f0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
15800 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
15810 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
15820 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
15830 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
15840 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
15850 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
15860 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
15870 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
15880 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20  Pg;.        u32 
15890 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
158a0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
158b0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
158c0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
158d0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
158e0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  er);.          T
158f0 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
15900 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
15910 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15920 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
15930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
15940 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
15950 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
15960 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
15970 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
15980 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
15990 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
159a0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
159b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
159c0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
159d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
159e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
159f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
15a00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15a10 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
15a20 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f  um;.          CO
15a30 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
15a40 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
15a50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
15a60 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
15a70 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
15a80 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
15a90 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
15aa0 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
15ab0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  RA(pPg, pPager);
15ac0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
15ad0 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
15ae0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
15af0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
15b00 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
15b10 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
15b20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
15b30 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
15b40 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -4);.          
15b50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
15b60 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
15b70 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
15b80 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
15b90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
15ba0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
15bb0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
15bc0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
15bd0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
15be0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
15bf0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
15c00 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
15c10 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
15c20 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
15c30 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
15c40 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
15c50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   0);.          *
15c60 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
15c70 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
15c80 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
15c90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
15cc0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
15cd0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
15ce0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
15cf0 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
15d00 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
15d10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15d20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15d30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
15d40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15d50 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
15d60 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
15d70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15d80 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
15d90 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
15da0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
15db0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
15dc0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
15dd0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
15de0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
15df0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
15e00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
15e10 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
15e20 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
15e30 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
15e40 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
15e50 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
15e60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15e70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
15e80 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
15e90 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
15ea0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
15eb0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
15ec0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
15ed0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
15ee0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
15ef0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15f00 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
15f10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
15f20 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
15f30 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
15f40 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
15f50 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
15f60 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
15f70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
15f80 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
15f90 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
15fa0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
15fb0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15fc0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
15fd0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
15fe0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
15ff0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16000 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
16010 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
16020 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
16030 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
16040 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
16050 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
16060 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
16070 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
16080 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
16090 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
160a0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
160b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
160c0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
160d0 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
160e0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
160f0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
16100 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
16110 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
16120 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
16130 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
16140 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
16150 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
16160 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
16170 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
16180 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16190 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
161a0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
161b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
161c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
161d0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
161e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
161f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
16200 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
16210 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
16220 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
16230 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16240 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
16250 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
16260 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
16270 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
16280 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
16290 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
162a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
162b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
162c0 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
162d0 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
162e0 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
162f0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
16300 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
16310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16320 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
16330 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61  stfd,((char*)pDa
16340 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70  ta)-4, pPager->p
16350 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
16360 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
16370 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
16380 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16390 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
163a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
163b0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
163c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
163d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
163e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
163f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
16400 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
16410 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16420 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
16430 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
16440 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
16450 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
16460 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
16470 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
16480 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16490 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
164a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
164b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
164c0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
164d0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
164e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
164f0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
16500 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
16510 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
16520 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
16530 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
16540 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
16550 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
16560 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
16570 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
16580 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
16590 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
165a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
165b0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
165c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
165d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
165e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
165f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16600 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16610 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
16620 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
16630 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
16640 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
16650 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
16660 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
16670 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
16680 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
16690 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
166a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
166b0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
166c0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
166d0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
166e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
166f0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16700 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
16710 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f  pPg->dirty;.}../
16720 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65  *.** Replace the
16730 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69   content of a si
16740 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74  ngle page with t
16750 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
16760 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61  n the third.** a
16770 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
16780 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65  sqlite3pager_ove
16790 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  rwrite(Pager *pP
167a0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
167b0 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20   void *pData){. 
167c0 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
167d0 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
167e0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
167f0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26  (pPager, pgno, &
16800 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
16810 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
16820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
16830 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
16840 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
16850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16860 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20    memcpy(pPage, 
16870 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
16880 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
16890 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
168a0 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
168b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
168c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
168d0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
168e0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
168f0 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e  that it is not n
16900 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77  ecessary to.** w
16910 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61  rite the informa
16920 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67  tion on page "pg
16930 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20  no" back to the 
16940 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
16950 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
16960 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
16970 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
16980 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
16990 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
169a0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
169b0 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
169c0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
169d0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
169e0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
169f0 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
16a00 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
16a10 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
16a20 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
16a30 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
16a40 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
16a50 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
16a60 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
16a70 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
16a80 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65  nt_rollback() be
16a90 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
16aa0 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
16ab0 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
16ac0 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
16ad0 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
16ae0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
16af0 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
16b00 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
16b10 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
16b20 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
16b30 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
16b40 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
16b50 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61  lls to sqlite3pa
16b60 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
16b70 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
16b80 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
16b90 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
16ba0 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
16bb0 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
16bc0 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
16bd0 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
16be0 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
16bf0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
16c00 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
16c10 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
16c20 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
16c30 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
16c40 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
16c50 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
16c60 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
16c70 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
16c80 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
16c90 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
16ca0 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
16cb0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
16cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16cd0 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
16ce0 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
16cf0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
16d00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
16d10 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
16d20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
16d30 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
16d40 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
16d50 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
16d60 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
16d70 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
16d80 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
16d90 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
16da0 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
16db0 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
16dc0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
16dd0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
16de0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
16df0 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70  turn;..  pPg = p
16e00 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
16e10 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67  er, pgno);.  pPg
16e20 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
16e30 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20   = 1;.  if( pPg 
16e40 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  && pPg->dirty ){
16e50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16e60 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50  >dbSize==(int)pP
16e70 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65  g->pgno && pPage
16e80 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50  r->origDbSize<pP
16e90 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
16ea0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
16eb0 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61   pages is the la
16ec0 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  st page in the f
16ed0 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
16ee0 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20   has grown.     
16ef0 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63   ** during the c
16f00 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
16f10 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20  on, then do NOT 
16f20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
16f30 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a   clean..      **
16f40 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   When the databa
16f50 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77  se file grows, w
16f60 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65  e must make sure
16f70 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
16f80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74  age.      ** get
16f90 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61  s written at lea
16fa0 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20  st once so that 
16fb0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69  the disk file wi
16fc0 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63  ll be the correc
16fd0 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e  t.      ** size.
16fe0 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77   If you do not w
16ff0 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61  rite this page a
17000 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
17010 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  he file.      **
17020 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64   on the disk end
17030 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73  s up being too s
17040 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c  mall, that can l
17050 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a  ead to database.
17060 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74        ** corrupt
17070 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e  ion during the n
17080 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ext transaction.
17090 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
170a0 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
170b0 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
170c0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
170d0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
170e0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
170f0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
17100 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
17110 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
17120 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
17130 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20  e pager that if 
17140 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
17150 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  s,.** it is not 
17160 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73  necessary to res
17170 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e  tore the data on
17180 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e   the given page.
17190 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20    This.** means 
171a0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64  that the pager d
171b0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
171c0 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e  record the given
171d0 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20   page in the.** 
171e0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
171f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
17200 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c  3pager_dont_roll
17210 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
17220 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
17230 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
17240 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20  pData);.  Pager 
17250 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
17260 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50  Pager;..  if( pP
17270 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
17280 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
17290 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
172a0 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  pen==0 ) return;
172b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
172c0 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
172d0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
172e0 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20  back || MEMDB ) 
172f0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70  return;.  if( !p
17300 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
17310 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
17320 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
17330 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  bSize ){.    ass
17340 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
17350 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
17360 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
17370 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
17380 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
17390 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e  no&7);.    pPg->
173a0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
173b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
173c0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
173d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
173e0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
173f0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
17400 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61  7);.      page_a
17410 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
17420 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPg);.    }.    
17430 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c  TRACE3("DONT_ROL
17440 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66  LBACK page %d of
17450 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
17460 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
17470 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  r));.  }.  if( p
17480 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
17490 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
174a0 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
174b0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
174c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
174d0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
174e0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
174f0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
17500 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
17510 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
17520 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
17530 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17540 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
17550 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17560 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f  );.    page_add_
17570 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
17580 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
17590 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f   Clear a PgHisto
175a0 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  ry block.*/.stat
175b0 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73  ic void clearHis
175c0 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a  tory(PgHistory *
175d0 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65  pHist){.  sqlite
175e0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69  Free(pHist->pOri
175f0 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  g);.  sqliteFree
17600 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
17610 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
17620 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74   0;.  pHist->pSt
17630 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mt = 0;.}../*.**
17640 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
17650 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
17660 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
17670 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
17680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
17690 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
176a0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
176b0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
176c0 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
176d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
176e0 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
176f0 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
17700 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
17710 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
17720 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
17730 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
17740 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
17750 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
17760 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
17770 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k==PAGER_ERR_FUL
17780 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  L ){.    rc = sq
17790 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
177a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
177b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
177c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
177d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
177e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
177f0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
17800 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
17810 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
17820 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
17830 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
17840 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
17850 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
17860 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
17870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
17880 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
17890 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
178a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
178b0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
178c0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
178d0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
178e0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
178f0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
17900 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
17910 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
17920 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
17930 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
17940 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
17950 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
17960 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
17970 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
17980 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
17990 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
179a0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
179b0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
179c0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
179d0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
179e0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
179f0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
17a00 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
17a10 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
17a20 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
17a30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
17a40 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
17a50 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
17a60 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
17a70 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
17a80 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
17a90 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
17aa0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
17ab0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
17ac0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
17ad0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
17ae0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
17af0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17b00 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
17b10 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
17b20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
17b30 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
17b40 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
17b50 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
17b60 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
17b70 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
17b80 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
17b90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17ba0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
17bb0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
17bc0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
17bd0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
17be0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17bf0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17c00 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
17c10 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
17c20 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
17c30 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
17c40 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
17c50 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  c(pPager, 0, 0);
17c60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17c70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
17c80 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
17c90 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
17ca0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
17cb0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
17cc0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
17cd0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
17ce0 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74  ump here if anyt
17cf0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
17d00 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
17d10 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  t process..  */.
17d20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20  commit_abort:.  
17d30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
17d40 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
17d50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17d60 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
17d70 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
17d80 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
17d90 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
17da0 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
17db0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
17dc0 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
17dd0 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
17de0 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
17df0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
17e00 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
17e10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
17e20 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
17e30 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
17e40 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
17e50 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
17e60 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
17e70 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
17e80 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
17e90 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
17ea0 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
17eb0 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
17ec0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
17ed0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
17ee0 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
17ef0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
17f00 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
17f10 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
17f20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
17f30 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
17f40 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
17f50 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
17f60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
17f70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
17f80 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
17f90 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
17fa0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17fb0 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c  ;.  TRACE2("ROLL
17fc0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
17fd0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
17fe0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
17ff0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
18000 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
18010 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
18020 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
18030 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
18040 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
18050 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
18060 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
18070 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
18080 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
18090 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
180a0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
180b0 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
180c0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
180d0 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
180e0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
180f0 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
18100 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
18110 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18120 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18130 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
18140 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
18150 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
18160 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
18170 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
18180 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
18190 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
181a0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f        TRACE3("RO
181b0 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
181c0 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
181d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
181e0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
181f0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
18200 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
18210 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
18220 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
18230 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
18240 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
18250 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
18260 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
18270 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
18280 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
18290 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
182a0 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20   p->pPrevStmt = 
182b0 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  p->pNextStmt = 0
182c0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
182d0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
182e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
182f0 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
18300 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
18310 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
18320 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
18330 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
18340 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
18350 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
18360 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
18370 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
18380 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
18390 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
183a0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
183b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
183c0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
183d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
183e0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
183f0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
18400 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
18410 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
18420 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
18430 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
18440 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
18450 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
18460 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
18470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18480 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
18490 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
184a0 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
184b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
184c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
184d0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
184e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
184f0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
18500 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
18510 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
18520 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
18530 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
18540 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
18550 74 20 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20  t rc2, rc3;.    
18560 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61  rc = pager_reloa
18570 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
18580 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
18590 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
185a0 2c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  , pPager->origDb
185b0 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d  Size);.    rc3 =
185c0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
185d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
185e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
185f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18600 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc2;.      if( r
18610 63 33 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20  c3 ) rc = rc3;. 
18620 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
18630 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
18640 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
18650 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
18660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18670 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
18680 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52  T;  /* bkpt-CORR
18690 55 50 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  UPT */.    pPage
186a0 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
186b0 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b  GER_ERR_CORRUPT;
186c0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64  .  }.  pPager->d
186d0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
186e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
186f0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
18700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18710 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
18720 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
18730 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
18740 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
18750 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
18760 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18770 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79  pager_isreadonly
18780 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
18790 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
187a0 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
187b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
187c0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
187d0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
187e0 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
187f0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74  *sqlite3pager_st
18800 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
18810 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
18820 20 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20   a[9];.  a[0] = 
18830 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
18840 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
18850 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
18860 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
18870 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
18880 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
18890 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
188a0 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
188b0 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d  >errMask;.  a[6]
188c0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
188d0 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
188e0 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
188f0 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
18900 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a  .  return a;.}..
18910 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74  /*.** Set the st
18920 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
18930 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   point..**.** Th
18940 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c  is routine shoul
18950 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  d be called with
18960 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18970 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79   journal already
18980 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77  .** open.  A new
18990 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
189a0 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68  al is created th
189b0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
189c0 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68  o rollback.** ch
189d0 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c  anges of a singl
189e0 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69  e SQL command wi
189f0 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72  thin a larger tr
18a00 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
18a10 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
18a20 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20  tmt_begin(Pager 
18a30 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
18a40 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  rc;.  char zTemp
18a50 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
18a60 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74  _SIZE];.  assert
18a70 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
18a80 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
18a90 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18aa0 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28  >=0 );.  TRACE2(
18ab0 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
18ac0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
18ad0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
18ae0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
18af0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
18b00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
18b10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
18b20 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
18b30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
18b40 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
18b50 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18b60 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
18b70 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
18b80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18b90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18bb0 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
18bc0 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
18bd0 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
18be0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
18bf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
18c00 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
18c10 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
18c20 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
18c30 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65  ED_LOCK);.    re
18c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
18c50 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
18c60 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
18c70 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
18c80 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
18c90 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
18ca0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
18cb0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
18cc0 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70  led;.  assert( p
18cd0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
18ce0 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   == pPager->jour
18cf0 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66  nalOff );.#endif
18d00 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
18d10 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a  Size = pPager->j
18d20 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61  ournalOff;.  pPa
18d30 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
18d40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
18d50 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
18d60 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  rOff = 0;.  pPag
18d70 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20  er->stmtCksum = 
18d80 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
18d90 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  t;.  if( !pPager
18da0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
18db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
18dc0 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65  ger_opentemp(zTe
18dd0 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66  mp, &pPager->stf
18de0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
18df0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
18e00 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
18e10 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
18e20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
18e30 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
18e40 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
18e50 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
18e60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
18e70 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
18e80 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
18e90 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
18ea0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
18eb0 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
18ec0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18ed0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
18ee0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18ef0 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
18f00 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18f10 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d  e3pager_stmt_com
18f20 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
18f30 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
18f40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
18f50 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
18f60 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45  pNext;.    TRACE
18f70 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
18f80 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
18f90 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
18fa0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
18fb0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
18fc0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
18fd0 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
18fe0 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
18ff0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
19000 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
19010 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
19020 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
19030 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
19040 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19050 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
19060 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  t; pPg; pPg=pNex
19070 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  t){.      pNext 
19080 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
19090 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
190a0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20  pPg->inStmt );. 
190b0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
190c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
190d0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
190e0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
190f0 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
19100 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
19110 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
19120 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
19130 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
19140 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
19150 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
19160 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
19170 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 0;.      }. 
19180 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
19190 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
191a0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
191b0 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
191c0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
191d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
191e0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
191f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
19210 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65  llback a stateme
19220 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
19230 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c  e3pager_stmt_rol
19240 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
19250 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
19260 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19270 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54  mtInUse ){.    T
19280 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
19290 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
192a0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
192b0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
192c0 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
192d0 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
192e0 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
192f0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
19300 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
19310 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
19320 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
19330 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
19340 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
19350 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
19360 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
19370 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
19380 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
19390 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
193a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
193b0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
193c0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
193d0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
193e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
193f0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
19400 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
19410 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
19420 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
19430 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
19440 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19460 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
19470 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
19480 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
19490 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
194a0 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
194b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
194c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
194d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
194e0 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65  toopen = 0;.  re
194f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
19510 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
19520 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
19530 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
19540 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c  sqlite3pager_fil
19550 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
19560 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
19570 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
19580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19590 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
195a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
195b0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
195c0 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
195d0 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20  r_dirname(Pager 
195e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
195f0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
19600 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
19610 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
19620 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
19630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
19640 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
19650 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61  ite3pager_journa
19660 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  lname(Pager *pPa
19670 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
19680 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b  Pager->zJournal;
19690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
196a0 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73  e codec for this
196b0 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73   pager.*/.void s
196c0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
196d0 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a  codec(.  Pager *
196e0 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28  pPager,.  void (
196f0 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
19700 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
19710 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
19720 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
19730 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
19740 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
19750 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
19760 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
19770 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
19780 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
19790 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
197a0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
197b0 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
197c0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
197d0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
197e0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
197f0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
19800 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19810 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20   void *pPage;.  
19820 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
19830 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e   u32 change_coun
19840 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ter;.  int rc;..
19850 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
19860 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
19870 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72   writing. */.  r
19880 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19890 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20  _get(pPager, 1, 
198a0 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
198b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
198c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
198d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
198e0 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  ite(pPage);.  if
198f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19900 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19910 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72  /* Read the curr
19920 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74  ent value at byt
19930 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64  e 24. */.  pPgHd
19940 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  r = DATA_TO_PGHD
19950 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e  R(pPage);.  chan
19960 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
19970 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
19980 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49  dr, 24);..  /* I
19990 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c  ncrement the val
199a0 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64  ue just read and
199b0 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74   write it back t
199c0 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  o byte 24. */.  
199d0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
199e0 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28  ;.  store32bits(
199f0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20  change_counter, 
19a00 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
19a10 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
19a20 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
19a30 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  /.  sqlite3pager
19a40 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
19a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19a80 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
19a90 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
19aa0 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
19ab0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
19ac0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19ad0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
19ae0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
19af0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
19b00 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
19b10 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
19b20 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
19b30 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
19b40 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
19b50 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
19b60 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
19b70 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19b80 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
19b90 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
19ba0 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
19bb0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
19bc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19bd0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
19be0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
19bf0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
19c00 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
19c10 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
19c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19c30 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
19c40 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
19c50 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
19c60 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
19c70 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
19c80 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
19c90 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
19ca0 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
19cb0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
19cc0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
19cd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
19ce0 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  c() call..**.** 
19cf0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
19d00 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
19d10 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
19d20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
19d30 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
19d40 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
19d50 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
19d60 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
19d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
19d80 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  r_sync(Pager *pP
19d90 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
19da0 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
19db0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
19dc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
19dd0 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41    TRACE4("DATABA
19de0 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
19df0 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
19e00 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
19e10 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
19e20 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
19e30 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
19e40 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
19e50 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
19e60 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
19e70 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
19e80 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
19e90 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19ea0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
19eb0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
19ec0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
19ed0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
19ee0 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
19ef0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
19f00 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
19f10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
19f20 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
19f30 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n );..    /* If 
19f40 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
19f50 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
19f60 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
19f70 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
19f80 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
19f90 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
19fa0 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
19fb0 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
19fc0 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
19fd0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
19fe0 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
19ff0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
1a000 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
1a010 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1a020 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
1a030 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
1a040 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
1a050 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1a060 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
1a070 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
1a080 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
1a090 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1a0a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
1a0b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1a0c0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1a0d0 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
1a0e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a0f0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1a100 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64  sync_exit;.#ifnd
1a110 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1a120 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
1a130 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1a140 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
1a150 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
1a160 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
1a170 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
1a180 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
1a190 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
1a1a0 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
1a1b0 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
1a1c0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
1a1d0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1a1e0 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
1a1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1a200 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f  no i;.        vo
1a210 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  id *pPage;.     
1a220 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63     for( i=nTrunc
1a230 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f  +1; i<=pPager->o
1a240 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29  rigDbSize; i++ )
1a250 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1a260 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  !(pPager->aInJou
1a270 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c  rnal[i/8] & (1<<
1a280 28 69 26 37 29 29 29 20 29 7b 0a 20 20 20 20 20  (i&7))) ){.     
1a290 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a2a0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
1a2b0 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b  ger, i, &pPage);
1a2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a2d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a2e0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1a2f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1a300 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1a310 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
1a320 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1a330 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
1a340 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1a350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a360 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1a370 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
1a380 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
1a390 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
1a3a0 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
1a3b0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
1a3c0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
1a3d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a3e0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1a3f0 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
1a400 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
1a410 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
1a420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1a430 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1a440 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1a450 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1a460 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75  UUM.    if( nTru
1a470 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  nc!=0 ){.      r
1a480 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1a490 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
1a4a0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20  , nTrunc);.     
1a4b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a4c0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1a4d0 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  xit;.    }.#endi
1a4e0 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  f..    /* Write 
1a4f0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
1a500 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1a510 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  file */.    pPg 
1a520 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1a530 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1a540 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  er);.    rc = pa
1a550 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1a560 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  st(pPg);.    if(
1a570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a580 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1a590 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
1a5a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a5b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
1a5c0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
1a5d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a5e0 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
1a5f0 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >fd);.    }..   
1a600 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1a610 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20   PAGER_SYNCED;. 
1a620 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20   }..sync_exit:. 
1a630 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1a640 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a650 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
1a660 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
1a670 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1a680 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f  pData to locatio
1a690 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
1a6a0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  le. .**.** There
1a6b0 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65   must be no refe
1a6c0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75  rences to the cu
1a6d0 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e  rrent page pgno.
1a6e0 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65   If current page
1a6f0 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20  .** pgno is not 
1a700 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72  already in the r
1a710 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
1a720 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74   it is not writt
1a730 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62  en there by.** b
1a740 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  y this routine. 
1a750 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73  The same applies
1a760 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61   to the page pDa
1a770 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20  ta refers to on 
1a780 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73  entry to.** this
1a790 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1a7a0 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
1a7b0 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74  e page refered t
1a7c0 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69  o by pData remai
1a7d0 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
1a7e0 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
1a7f0 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
1a800 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69  th page pData (i
1a810 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20  .e. data stored 
1a820 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79  in the nExtra by
1a830 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  tes.** allocated
1a840 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
1a850 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73  page) is the res
1a860 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
1a870 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
1a880 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d   A transaction m
1a890 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68  ust be active wh
1a8a0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1a8b0 69 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65 76  is called, howev
1a8c0 65 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c 6c  er it is .** ill
1a8d0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69  egal to call thi
1a8e0 73 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20 73  s routine if a s
1a8f0 74 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  tatment transact
1a900 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a  ion is active..*
1a910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1a920 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1a930 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1a940 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1a950 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1a960 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1a970 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1a980 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1a990 20 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21   h;..  assert( !
1a9a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a9b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1a9c0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
1a9d0 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64   TRACE5("MOVE %d
1a9e0 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
1a9f0 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
1aa00 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
1aa10 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1aa20 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1aa30 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
1aa40 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1aa50 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1aa60 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1aa70 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1aa80 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1aa90 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1aaa0 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1aab0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1aac0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1aad0 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1aae0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1aaf0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1ab00 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1ab10 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1ab20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1ab30 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1ab40 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1ab50 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1ab60 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1ab70 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1ab80 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1ab90 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1aba0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1abb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1abc0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1abd0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1abe0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1abf0 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d  ld);.    pPgOld-
1ac00 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1ac10 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1ac20 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 50  Sync ){.      pP
1ac30 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  g->needSync = 1;
1ac40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1ac50 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
1ac60 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
1ac70 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
1ac80 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
1ac90 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d  chain. */.  pPg-
1aca0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1acb0 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
1acc0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
1acd0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
1ace0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1acf0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1ad00 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
1ad10 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1ad20 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
1ad30 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
1ad40 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
1ad50 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
1ad60 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1ad70 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
1ad80 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
1ad90 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1ada0 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
1adb0 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 72 65  Cache = 1;..  re
1adc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1add0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  }.#endif..#if de
1ade0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1adf0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1ae00 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
1ae10 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
1ae20 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
1ae30 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
1ae40 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
1ae50 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
1ae60 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
1ae70 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
1ae80 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
1ae90 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
1aea0 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
1aeb0 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
1aec0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b  qlite3pager_lock
1aed0 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  state(Pager *pPa
1aee0 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f  ger){.#ifdef OS_
1aef0 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50  TEST.  return pP
1af00 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63  ager->fd->fd.loc
1af10 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72  ktype;.#else.  r
1af20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
1af30 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69  .locktype;.#endi
1af40 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  f.}.#endif..#ifd
1af50 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
1af60 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
1af70 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
1af80 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
1af90 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
1afa0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1afb0 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50  3pager_refdump(P
1afc0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1afd0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
1afe0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
1aff0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
1b000 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
1b010 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
1b020 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1b030 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
1b040 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
1b050 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
1b060 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
1b070 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
1b080 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
1b090 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
1b0a0 64 69 66 0a                                      dif.