/ Hex Artifact Content
Login

Artifact 0523c8a122f95b41008b87cae2cc1d368452dbfc:


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: 34 20 32 30 30 34 2f 31 31 2f 30 36 20 31 32 3a  4 2004/11/06 12:
0360: 32 36 3a 30 38 20 64 61 6e 69 65 6c 6b 31 39 37  26:08 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 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ).#else.#define 
04f0: 54 52 41 43 45 31 28 58 29 0a 23 64 65 66 69 6e  TRACE1(X).#defin
0500: 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  e TRACE2(X,Y).#d
0510: 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59  efine TRACE3(X,Y
0520: 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,Z).#define TRAC
0530: 45 34 28 58 2c 59 2c 5a 2c 57 29 0a 23 65 6e 64  E4(X,Y,Z,W).#end
0540: 69 66 0a 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  if..#ifdef OS_TE
0550: 53 54 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  ST.#define PAGER
0560: 49 44 28 70 29 20 28 70 2d 3e 66 64 2d 3e 66 64  ID(p) (p->fd->fd
0570: 2e 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45  .h).#define FILE
0580: 48 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64  HANDLEID(fd) (fd
0590: 2d 3e 66 64 2e 68 29 0a 23 65 6c 73 65 0a 23 64  ->fd.h).#else.#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70 29  efine PAGERID(p)
05b0: 20 28 70 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69   (p->fd.h).#defi
05c0: 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ne FILEHANDLEID(
05d0: 66 64 29 20 28 66 64 2e 68 29 0a 23 65 6e 64 69  fd) (fd.h).#endi
05e0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  f../*.** The pag
05f0: 65 20 63 61 63 68 65 20 61 73 20 61 20 77 68 6f  e cache as a who
0600: 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  le is always in 
0610: 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
0620: 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a  wing.** states:.
0630: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e  **.**   PAGER_UN
0640: 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68 65 20  LOCK        The 
0650: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f  page cache is no
0660: 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64  t currently read
0670: 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20  ing or .**      
0680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0690: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
06a0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65  abase file.  The
06b0: 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20  re is no.**     
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06d0: 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d    data held in m
06e0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20  emory.  This is 
06f0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20  the initial.**  
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a       state..**.*
0720: 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52 45 44  *   PAGER_SHARED
0730: 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65          The page
0740: 20 63 61 63 68 65 20 69 73 20 72 65 61 64 69 6e   cache is readin
0750: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
0760: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0770: 20 20 20 20 20 20 20 20 20 57 72 69 74 69 6e 67           Writing
0780: 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65   is not permitte
0790: 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20 62 65  d.  There can be
07a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
07b0: 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70            multip
07c0: 6c 65 20 72 65 61 64 65 72 73 20 61 63 63 65 73  le readers acces
07d0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
07e0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
0810: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50   time..**.**   P
0820: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20  AGER_RESERVED   
0830: 20 20 20 54 68 69 73 20 70 72 6f 63 65 73 73 20     This process 
0840: 68 61 73 20 72 65 73 65 72 76 65 64 20 74 68 65  has reserved the
0850: 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77 72   database for wr
0860: 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  iting.**        
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
0880: 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d  ut has not yet m
0890: 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e  ade any changes.
08a0: 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65    Only one proce
08b0: 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ss.**           
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 20 61              at a
08d0: 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76   time can reserv
08e0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  e the database. 
08f0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   The original.**
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0910: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
0920: 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65  file has not bee
0930: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74  n modified so ot
0940: 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  her.**          
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
0960: 63 65 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c  cesses may still
0970: 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65 20   be reading the 
0980: 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20  on-disk.**      
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
09b0: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58  **.**   PAGER_EX
09c0: 43 4c 55 53 49 56 45 20 20 20 20 20 54 68 65 20  CLUSIVE     The 
09d0: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 77 72  page cache is wr
09e0: 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
09f0: 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  se..**          
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 63 63               Acc
0a10: 65 73 73 20 69 73 20 65 78 63 6c 75 73 69 76 65  ess is exclusive
0a20: 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63  .  No other proc
0a30: 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20  esses or.**     
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a50: 20 20 74 68 72 65 61 64 73 20 63 61 6e 20 62 65    threads can be
0a60: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
0a70: 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a  ing while one.**
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 20 20 20 70 72 6f 63 65 73 73 20 69         process i
0aa0: 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  s writing..**.**
0ab0: 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20     PAGER_SYNCED 
0ac0: 20 20 20 20 20 20 20 54 68 65 20 70 61 67 65 72         The pager
0ad0: 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73   moves to this s
0ae0: 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f  tate from PAGER_
0af0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72     after all dir
0b20: 74 79 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ty pages have be
0b30: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
0b40: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0b50: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
0b60: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
0b70: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
0b80: 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20  ynced to.**     
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74    disk. All that
0bb0: 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69   remains to do i
0bc0: 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 0a  s to remove the.
0bd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0be0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
0bf0: 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72   file and the tr
0c00: 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
0c10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0c20: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 69             commi
0c30: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0c40: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0c50: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0c60: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0c70: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0c80: 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f 63 63  3pager_get() occ
0c90: 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74  urs, the state t
0ca0: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0cb0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41  GER_SHARED..** A
0cc0: 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68  fter all pages h
0cd0: 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65  ave been release
0ce0: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70  d using sqlite_p
0cf0: 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20  age_unref(),.** 
0d00: 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69  the state transi
0d10: 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41  tions back to PA
0d20: 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65  GER_UNLOCK.  The
0d30: 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74   first time.** t
0d40: 68 61 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  hat sqlite3pager
0d50: 5f 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  _write() is call
0d60: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0d70: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0d80: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0d90: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0da0: 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20  te_page_write() 
0db0: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0dc0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0dd0: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0de0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0df0: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0e00: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0e10: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0e20: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e30: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0e40: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
0e50: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
0e60: 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62 65  E occurs when be
0e70: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
0e80: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
0e90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0ea0: 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  e.  After an sql
0eb0: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
0ec0: 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74  ck().** or sqlit
0ed0: 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e_pager_commit()
0ee0: 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73  , the state goes
0ef0: 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
0f00: 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e  HARED..*/.#defin
0f10: 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20  e PAGER_UNLOCK  
0f20: 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41      0.#define PA
0f30: 47 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20  GER_SHARED      
0f40: 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53  1   /* same as S
0f50: 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64  HARED_LOCK */.#d
0f60: 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45  efine PAGER_RESE
0f70: 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73  RVED    2   /* s
0f80: 61 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f  ame as RESERVED_
0f90: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
0fa0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0fb0: 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    4   /* same as
0fc0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
0fd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
0fe0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a  _SYNCED      5..
0ff0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  /*.** If the SQL
1000: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
1010: 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20  D_LOCK macro is 
1020: 73 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63  set to true at c
1030: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20  ompile-time,.** 
1040: 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65  then failed atte
1050: 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65  mpts to get a re
1060: 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c  served lock will
1070: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1080: 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68   callback..** Th
1090: 69 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66  is is off by def
10a0: 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68  ault.  To see wh
10b0: 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  y, consider the 
10c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72  following scenar
10d0: 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f  io:.** .** Suppo
10e0: 73 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65  se thread A alre
10f0: 61 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64  ady has a shared
1100: 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20   lock and wants 
1110: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1120: 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72  .** Thread B alr
1130: 65 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72  eady has a reser
1140: 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  ved lock and wan
1150: 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ts an exclusive 
1160: 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74  lock.  If.** bot
1170: 68 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73  h threads are us
1180: 69 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63  ing their busy c
1190: 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67  allbacks, it mig
11a0: 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d  ht be a long tim
11b0: 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20  e.** be for one 
11c0: 6f 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67  of the threads g
11d0: 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77  ive up and allow
11e0: 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70  s the other to p
11f0: 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69  roceed..** But i
1200: 66 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79  f the thread try
1210: 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72  ing to get the r
1220: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76  eserved lock giv
1230: 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a  es up quickly.**
1240: 20 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e   (if it never in
1250: 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63  vokes its busy c
1260: 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68  allback) then th
1270: 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c  e contention wil
1280: 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64  l be.** resolved
1290: 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66   quickly..*/.#if
12a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59  ndef SQLITE_BUSY
12b0: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23  _RESERVED_LOCK.#
12c0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42   define SQLITE_B
12d0: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
12e0: 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 0.#endif../*.*
12f0: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75  * This macro rou
1300: 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f  nds values up so
1310: 20 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c   that if the val
1320: 75 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73  ue is an address
1330: 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e   it.** is guaran
1340: 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64  teed to be an ad
1350: 64 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c  dress that is al
1360: 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79  igned to an 8-by
1370: 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
1380: 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c  #define FORCE_AL
1390: 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28  IGNMENT(X)   (((
13a0: 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a  X)+7)&~7)../*.**
13b0: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
13c0: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
13d0: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
13e0: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
13f0: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1400: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1410: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1420: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1430: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1440: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1450: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1460: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1470: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1480: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1490: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70 61 67   call sqlite3pag
14a0: 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20 61 20  er_write() on a 
14b0: 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61  page prior to ma
14c0: 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69  king.** any modi
14d0: 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61  fications to tha
14e0: 74 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72  t page.  The fir
14f0: 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 70  st time sqlite3p
1500: 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a 2a 20  ager_write().** 
1510: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f  is called, the o
1520: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
1530: 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74 65  tents are writte
1540: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
1550: 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  ack.** journal a
1560: 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e  nd PgHdr.inJourn
1570: 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65  al and PgHdr.nee
1580: 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20  dSync are set.  
1590: 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74  Later, once.** t
15a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  he journal page 
15b0: 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f  has made it onto
15c0: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
15d0: 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  e, PgHdr.needSyn
15e0: 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e  c.** is cleared.
15f0: 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70    The modified p
1600: 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72  age cannot be wr
1610: 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
1620: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1630: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e  database file un
1640: 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  til the journal 
1650: 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20 73  pages has been s
1660: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e  ynced to disk an
1670: 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e  d the.** PgHdr.n
1680: 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e  eedSync has been
1690: 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
16a0: 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79 20  The PgHdr.dirty 
16b0: 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65 6e  flag is set when
16c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
16d0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
16e0: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
16f0: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1700: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1710: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1720: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1730: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1740: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1750: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
1760: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
1770: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1790: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
17a0: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
17b0: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
17c0: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
17d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17e0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
17f0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1800: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1810: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1820: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1830: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1840: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1850: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1860: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1870: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1880: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1890: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
18a0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
18b0: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
18c0: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
18d0: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
18e0: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
18f0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1900: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1910: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1920: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1940: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1950: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1960: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
1970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1980: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1990: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
19a0: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
19b0: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
19e0: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
19f0: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1a00: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a20: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
1a30: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
1a40: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
1a50: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1a70: 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  sable dont_rollb
1a80: 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70  ack() for this p
1a90: 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  age */.  short i
1aa0: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ac0: 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68  r of users of th
1ad0: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1ae0: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1b00: 69 72 74 79 20 70 61 67 65 73 20 73 6f 72 74 65  irty pages sorte
1b10: 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e 6f 20  d by PgHdr.pgno 
1b20: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
1b30: 70 73 41 6c 69 67 6e 65 64 20 62 79 74 65 73 20  psAligned bytes 
1b40: 6f 66 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c  of page data fol
1b50: 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65 72 20  low this header 
1b60: 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45  */.  /* Pager.nE
1b70: 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f  xtra bytes of lo
1b80: 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20  cal data follow 
1b90: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  the page data */
1ba0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61  .};../*.** For a
1bb0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79  n in-memory only
1bc0: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20   database, some 
1bd0: 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f  extra informatio
1be0: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 62  n is recorded ab
1bf0: 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65  out.** each page
1c00: 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73   so that changes
1c10: 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
1c20: 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66  ack.  (Journal f
1c30: 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20  iles are not.** 
1c40: 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f  used for in-memo
1c50: 72 79 20 64 61 74 61 62 61 73 65 73 2e 29 20 20  ry databases.)  
1c60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e  The following in
1c70: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64  formation is add
1c80: 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64  ed to.** the end
1c90: 20 6f 66 20 65 76 65 72 79 20 45 58 54 52 41 20   of every EXTRA 
1ca0: 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d  block for in-mem
1cb0: 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ory databases..*
1cc0: 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d  *.** This inform
1cd0: 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65  ation could have
1ce0: 20 62 65 65 6e 20 61 64 64 65 64 20 64 69 72 65   been added dire
1cf0: 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64  ctly to the PgHd
1d00: 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  r structure..** 
1d10: 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c  But then it woul
1d20: 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74  d take up an ext
1d30: 72 61 20 38 20 62 79 74 65 73 20 6f 66 20 73 74  ra 8 bytes of st
1d40: 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50  orage on every P
1d50: 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72  gHdr.** even for
1d60: 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61   disk-based data
1d70: 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e  bases.  Splittin
1d80: 67 20 69 74 20 6f 75 74 20 73 61 76 65 73 20 38  g it out saves 8
1d90: 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a   bytes.  This.**
1da0: 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e   is only a savin
1db0: 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74  gs of 0.8% but t
1dc0: 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67 65 73  hose percentages
1dd0: 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65   add up..*/.type
1de0: 64 65 66 20 73 74 72 75 63 74 20 50 67 48 69 73  def struct PgHis
1df0: 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a  tory PgHistory;.
1e00: 73 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79  struct PgHistory
1e10: 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20   {.  u8 *pOrig; 
1e20: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
1e30: 70 61 67 65 20 74 65 78 74 2e 20 20 52 65 73 74  page text.  Rest
1e40: 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61  ore to this on a
1e50: 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a   full rollback *
1e60: 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20  /.  u8 *pStmt;  
1e70: 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74     /* Text as it
1e80: 20 77 61 73 20 61 74 20 74 68 65 20 62 65 67 69   was at the begi
1e90: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72  nning of the cur
1ea0: 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a  rent statement *
1eb0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61  /.};../*.** A ma
1ec0: 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76  cro used for inv
1ed0: 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20  oking the codec 
1ee0: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a  if there is one.
1ef0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1f00: 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66  _HAS_CODEC.# def
1f10: 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c  ine CODEC(P,D,N,
1f20: 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63  X) if( P->xCodec
1f30: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
1f40: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
1f50: 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  ); }.#else.# def
1f60: 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c 4e 2c  ine CODEC(P,D,N,
1f70: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
1f80: 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e 74   Convert a point
1f90: 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69 6e  er to a PgHdr in
1fa0: 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  to a pointer to 
1fb0: 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64 20  its data.** and 
1fc0: 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a 23  back again..*/.#
1fd0: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
1fe0: 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64 2a  DATA(P)  ((void*
1ff0: 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65 66  )(&(P)[1])).#def
2000: 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  ine DATA_TO_PGHD
2010: 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72 2a  R(D)  (&((PgHdr*
2020: 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66 69  )(D))[-1]).#defi
2030: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  ne PGHDR_TO_EXTR
2040: 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29 26  A(G,P) ((void*)&
2050: 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31 5d  ((char*)(&(G)[1]
2060: 29 29 5b 28 50 29 2d 3e 70 73 41 6c 69 67 6e 65  ))[(P)->psAligne
2070: 64 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  d]).#define PGHD
2080: 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29  R_TO_HIST(P,PGR)
2090: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20    \.            
20a0: 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28  ((PgHistory*)&((
20b0: 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29  char*)(&(P)[1]))
20c0: 5b 28 50 47 52 29 2d 3e 70 73 41 6c 69 67 6e 65  [(PGR)->psAligne
20d0: 64 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  d+(PGR)->nExtra]
20e0: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
20f0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
2100: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
2110: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
2120: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
2130: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
2140: 23 64 65 66 69 6e 65 20 4e 5f 50 47 5f 48 41 53  #define N_PG_HAS
2150: 48 20 32 30 34 38 0a 0a 2f 2a 0a 2a 2a 20 48 61  H 2048../*.** Ha
2160: 73 68 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72  sh a page number
2170: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70 61 67 65  .*/.#define page
2180: 72 5f 68 61 73 68 28 50 4e 29 20 20 28 28 50 4e  r_hash(PN)  ((PN
2190: 29 26 28 4e 5f 50 47 5f 48 41 53 48 2d 31 29 29  )&(N_PG_HASH-1))
21a0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
21b0: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
21c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
21d0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
21e0: 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50  ure..*/.struct P
21f0: 61 67 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 7a  ager {.  char *z
2200: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
2210: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2220: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2230: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
2240: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2250: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2260: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
2270: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
2280: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
2290: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
22a0: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
22b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
22c0: 20 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64    OsFile fd, jfd
22d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22e0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
22f0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
2300: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
2310: 4f 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20  OsFile stfd;    
2320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2330: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
2340: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
2350: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
2360: 69 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20  int dbSize;     
2370: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2380: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
2390: 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
23a0: 69 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20  int origDbSize; 
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64              /* d
23c0: 62 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65  bSize before the
23d0: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20   current change 
23e0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a  */.  int stmtSiz
23f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2400: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61   /* Size of data
2410: 62 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20  base (in pages) 
2420: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
2430: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69  */.  i64 stmtJSi
2440: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2450: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72   /* Size of jour
2460: 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69  nal at stmt_begi
2470: 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  n() */.  int nRe
2480: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2490: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24a0: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
24b0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  to the journal *
24c0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
24d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
24e0: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
24f0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
2500: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
2510: 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65 63 3b  .  int stmtNRec;
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2530: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
2540: 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75 62 6a  rds in stmt subj
2550: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
2560: 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20  nExtra;         
2570: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
2580: 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74  his many bytes t
2590: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
25a0: 20 70 61 67 65 20 2a 2f 0a 20 20 76 6f 69 64 20   page */.  void 
25b0: 28 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 76  (*xDestructor)(v
25c0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61  oid*,int); /* Ca
25d0: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
25e0: 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67  when freeing pag
25f0: 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  es */.  void (*x
2600: 52 65 69 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c  Reiniter)(void*,
2610: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
2620: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
2630: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
2640: 73 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53  s */.  int pageS
2650: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
2660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2670: 62 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20  bytes in a page 
2680: 2a 2f 0a 20 20 69 6e 74 20 70 73 41 6c 69 67 6e  */.  int psAlign
2690: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
26a0: 20 2f 2a 20 70 61 67 65 53 69 7a 65 20 72 6f 75   /* pageSize rou
26b0: 6e 64 65 64 20 75 70 20 74 6f 20 61 20 6d 75 6c  nded up to a mul
26c0: 74 69 70 6c 65 20 6f 66 20 38 20 2a 2f 0a 20 20  tiple of 8 */.  
26d0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26f0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
2700: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
2710: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  /* Number of in-
2740: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74  memory pages wit
2750: 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a  h PgHdr.nRef>0 *
2760: 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20  /.  int mxPage; 
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2790: 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f  r of pages to ho
27a0: 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ld in cache */. 
27b0: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
27c0: 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20  , nOvfl;     /* 
27d0: 43 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73  Cache hits, miss
27e0: 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65  ing, and LRU ove
27f0: 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 76 6f 69 64  rflows */.  void
2800: 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a   (*xCodec)(void*
2810: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
2820: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
2830: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
2840: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
2850: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
2860: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
2870: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
2880: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2890: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
28a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75    /* True if jou
28b0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
28c0: 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a  ptors is valid *
28d0: 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74  /.  u8 journalSt
28e0: 61 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20  arted;          
28f0: 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61 64 65  /* True if heade
2900: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20  r of journal is 
2910: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75  synced */.  u8 u
2920: 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  seJournal;      
2930: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61          /* Use a
2940: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
2950: 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  l on this file *
2960: 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b  /.  u8 stmtOpen;
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73  /* True if the s
2990: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
29a0: 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20  nal is open */. 
29b0: 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20   u8 stmtInUse;  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29d0: 54 72 75 65 20 77 65 20 61 72 65 20 69 6e 20 61  True we are in a
29e0: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
29f0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75  ansaction */.  u
2a00: 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20  8 stmtAutoopen; 
2a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
2a20: 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20  en stmt journal 
2a30: 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61  when main journa
2a40: 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20  l is opened*/.  
2a50: 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20  u8 noSync;      
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a70: 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a  o not sync the j
2a80: 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a  ournal if true *
2a90: 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b  /.  u8 fullSync;
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63  /* Do extra sync
2ac0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
2ad0: 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20   for robustness 
2ae0: 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20  */.  u8 state;  
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   /* PAGER_UNLOCK
2b10: 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45  , _SHARED, _RESE
2b20: 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20  RVED, etc. */.  
2b30: 75 38 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20  u8 errMask;     
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2b50: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
2b60: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
2b70: 0a 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20  .  u8 tempFile; 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b90: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61  * zFilename is a
2ba0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
2bb0: 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79  */.  u8 readOnly
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd0: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
2be0: 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
2bf0: 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  e */.  u8 needSy
2c00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2c10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e     /* True if an
2c20: 20 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64   fsync() is need
2c30: 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
2c40: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43  l */.  u8 dirtyC
2c50: 61 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20  ache;           
2c60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61     /* True if ca
2c70: 63 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20  ched pages have 
2c80: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20  changed */.  u8 
2c90: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20  alwaysRollback; 
2ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
2cb0: 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ble dont_rollbac
2cc0: 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65  k() for all page
2cd0: 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b  s */.  u8 memDb;
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e     /* True to in
2d00: 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49  hibit all file I
2d10: 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a  /O */.  u8 *aInJ
2d20: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2d30: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2d40: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2d50: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d60: 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74  e */.  u8 *aInSt
2d70: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
2d80: 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f     /* One bit fo
2d90: 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74  r each page in t
2da0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
2db0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2de0: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2df0: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2e00: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
2e10: 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20  usyHandler;  /* 
2e20: 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2e30: 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f  e.busyHandler */
2e40: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
2e50: 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f  , *pLast;      /
2e60: 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70  * List of free p
2e70: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
2e80: 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20  *pFirstSynced;  
2e90: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66        /* First f
2ea0: 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67  ree page with Pg
2eb0: 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Hdr.needSync==0 
2ec0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c  */.  PgHdr *pAll
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20   /* List of all 
2ef0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
2f00: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
2f10: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
2f20: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73  f pages in the s
2f30: 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72  tatement subjour
2f40: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
2f50: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
2f60: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2f70: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
2f80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2f90: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
2fa0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
2fb0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
2fc0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
2fd0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
2fe0: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3000: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
3010: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
3020: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
3030: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
3050: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
3060: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
3070: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63  ted */.  int sec
3080: 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  torSize;        
3090: 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20       /* Assumed 
30a0: 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69  sector size duri
30b0: 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ng rollback */. 
30c0: 20 50 67 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f   PgHdr *aHash[N_
30d0: 50 47 5f 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20  PG_HASH];    /* 
30e0: 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61  Hash table to ma
30f0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  p page number to
3100: 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   PgHdr */.};../*
3110: 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 62 69  .** These are bi
3120: 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 73  ts that can be s
3130: 65 74 20 69 6e 20 50 61 67 65 72 2e 65 72 72 4d  et in Pager.errM
3140: 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ask..*/.#define 
3150: 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 20  PAGER_ERR_FULL  
3160: 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77 72     0x01  /* a wr
3170: 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  ite() failed */.
3180: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
3190: 52 5f 4d 45 4d 20 20 20 20 20 20 30 78 30 32 20  R_MEM      0x02 
31a0: 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   /* malloc() fai
31b0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
31c0: 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 20 20  AGER_ERR_LOCK   
31d0: 20 20 30 78 30 34 20 20 2f 2a 20 65 72 72 6f 72    0x04  /* error
31e0: 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
31f0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66  protocol */.#def
3200: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 43 4f  ine PAGER_ERR_CO
3210: 52 52 55 50 54 20 20 30 78 30 38 20 20 2f 2a 20  RRUPT  0x08  /* 
3220: 64 61 74 61 62 61 73 65 20 6f 72 20 6a 6f 75 72  database or jour
3230: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  nal corruption *
3240: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
3250: 45 52 52 5f 44 49 53 4b 20 20 20 20 20 30 78 31  ERR_DISK     0x1
3260: 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c 20 64 69  0  /* general di
3270: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 2d 20 62  sk I/O error - b
3280: 61 64 20 68 61 72 64 20 64 72 69 76 65 3f 20 2a  ad hard drive? *
3290: 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  /../*.** Journal
32a0: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
32b0: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
32c0: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
32d0: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
32e0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
32f0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3300: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3310: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3320: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3330: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3340: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3350: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3360: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3370: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3380: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3390: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
33a0: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
33b0: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
33c0: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
33d0: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
33e0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
33f0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3400: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3410: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3420: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3430: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3440: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3450: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3460: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3470: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3480: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3490: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
34a0: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
34b0: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
34c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
34d0: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
34e0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
34f0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3500: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3510: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3520: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3530: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3540: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3550: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3560: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3570: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3580: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3590: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
35a0: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
35b0: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
35c0: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
35d0: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
35e0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
35f0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3600: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3610: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3620: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3630: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3640: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3650: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3660: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3670: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3680: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3690: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
36a0: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
36b0: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
36c0: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
36d0: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
36e0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
36f0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3710: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3720: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
3730: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
3740: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
3750: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
3760: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
3770: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
3780: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
3790: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
37a0: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
37b0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
37c0: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
37d0: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
37e0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
37f0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
3800: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
3810: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
3820: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
3830: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
3840: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
3850: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
3860: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
3870: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
3880: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
3890: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
38a0: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
38b0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
38c0: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
38d0: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
38e0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
38f0: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
3900: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
3910: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
3920: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
3930: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
3940: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
3950: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
3960: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
3970: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
3980: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3990: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
39a0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
39b0: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
39c0: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
39d0: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
39e0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
39f0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
3a00: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
3a10: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
3a20: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
3a30: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
3a40: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
3a50: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
3a60: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
3a70: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
3a80: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
3a90: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
3aa0: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
3ab0: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
3ac0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3ad0: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
3ae0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
3af0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
3b00: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
3b10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64  dif../*.** The d
3b20: 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 61  efault size of a
3b30: 20 64 69 73 6b 20 73 65 63 74 6f 72 0a 2a 2f 0a   disk sector.*/.
3b40: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 53 45  #define PAGER_SE
3b50: 43 54 4f 52 5f 53 49 5a 45 20 35 31 32 0a 0a 2f  CTOR_SIZE 512../
3b60: 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65 72  *.** Page number
3b70: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69   PAGER_MJ_PGNO i
3b80: 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e 20  s never used in 
3b90: 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  an SQLite databa
3ba0: 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65 73  se (it is.** res
3bb0: 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69 6e  erved for workin
3bc0: 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64 6f  g around a windo
3bd0: 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70 61  ws/posix incompa
3be0: 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69 73  tibility). It is
3bf0: 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65 20  .** used in the 
3c00: 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e 69  journal to signi
3c10: 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d 61  fy that the rema
3c20: 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  inder of the jou
3c30: 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69 73  rnal file .** is
3c40: 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f 72   devoted to stor
3c50: 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
3c60: 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65 72  rnal name - ther
3c70: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70 61  e are no more pa
3c80: 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62  ges to.** roll b
3c90: 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ack. See comment
3ca0: 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 77  s for function w
3cb0: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
3cc0: 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  l() for details.
3cd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
3ce0: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45  R_MJ_PGNO(x) (PE
3cf0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
3d00: 3e 70 61 67 65 53 69 7a 65 29 29 0a 0a 2f 2a 0a  >pageSize))../*.
3d10: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
3d20: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
3d30: 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e  ng (for debuggin
3d40: 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64  g) here:.*/.#ifd
3d50: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
3d60: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
3d70: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
3d80: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
3d90: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
3da0: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
3db0: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
3dc0: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
3dd0: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
3de0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
3df0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
3e00: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
3e10: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
3e20: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70  =%d\n",.       p
3e30: 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
3e40: 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65  _DATA(p), p->nRe
3e50: 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74  f.    );.    cnt
3e60: 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69  ++;   /* Somethi
3e70: 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ng to set a brea
3e80: 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d  kpoint on */.  }
3e90: 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46  .# define REFINF
3ea0: 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69  O(X)  pager_refi
3eb0: 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  nfo(X).#else.# d
3ec0: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
3ed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
3ee0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
3ef0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
3f00: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
3f10: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
3f20: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
3f30: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
3f40: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
3f50: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
3f60: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
3f70: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
3f80: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
3f90: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
3fa0: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
3fb0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
3fc0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
3fd0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
3fe0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
3ff0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32  32 *pRes){.  u32
4000: 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   res;.  int rc;.
4010: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4020: 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73  Read(fd, &res, s
4030: 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69  izeof(res));.  i
4040: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4050: 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   ){.    unsigned
4060: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20   char ac[4];.   
4070: 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73   memcpy(ac, &res
4080: 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  , 4);.    res = 
4090: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
40a0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
40b0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
40c0: 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65    }.  *pRes = re
40d0: 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  s;.  return rc;.
40e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
40f0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4100: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4110: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4120: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4130: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4140: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4150: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4160: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4170: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4180: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
4190: 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69  u32 val){.  unsi
41a0: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
41b0: 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e  .  ac[0] = (val>
41c0: 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >24) & 0xff;.  a
41d0: 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29  c[1] = (val>>16)
41e0: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d   & 0xff;.  ac[2]
41f0: 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78   = (val>>8) & 0x
4200: 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61  ff;.  ac[3] = va
4210: 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75  l & 0xff;.  retu
4220: 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74  rn sqlite3OsWrit
4230: 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a  e(fd, ac, 4);.}.
4240: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
4250: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4260: 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70  'val' into the p
4270: 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
4280: 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a  y page header.**
4290: 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20 27   'p' at offset '
42a0: 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74  offset'..*/.stat
42b0: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62  ic void store32b
42c0: 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48  its(u32 val, PgH
42d0: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
42e0: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
42f0: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
4300: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
4310: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
4320: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61  p))[offset];.  a
4330: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4340: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4350: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4360: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4370: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4380: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4390: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  0xff;.}../*.** R
43a0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
43b0: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27  eger at offset '
43c0: 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65  offset' from the
43d0: 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64   page identified
43e0: 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64   by.** page head
43f0: 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69  er 'p'..*/.stati
4400: 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32  c u32 retrieve32
4410: 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69  bits(PgHdr *p, i
4420: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4430: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4440: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4450: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4460: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
4470: 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61  et];.  return (a
4480: 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b  c[0]<<24) | (ac[
4490: 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d  1]<<16) | (ac[2]
44a0: 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a  <<8) | ac[3];.}.
44b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
44c0: 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20  the bits in the 
44d0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
44e0: 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61  into an appropra
44f0: 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64  te.** return cod
4500: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4510: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50   pager_errcode(P
4520: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
4530: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4540: 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65  _OK;.  if( pPage
4550: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4560: 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20  ER_ERR_LOCK )   
4570: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f   rc = SQLITE_PRO
4580: 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61  TOCOL;.  if( pPa
4590: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
45a0: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20  AGER_ERR_DISK ) 
45b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
45c0: 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67  OERR;.  if( pPag
45d0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
45e0: 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20  GER_ERR_FULL )  
45f0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
4600: 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  LL;.  if( pPager
4610: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4620: 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20  R_ERR_MEM )     
4630: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
4640: 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  M;.  if( pPager-
4650: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4660: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72  _ERR_CORRUPT ) r
4670: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
4680: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  PT;.  return rc;
4690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
46a0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
46b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
46c0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
46d0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
46e0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
46f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
4700: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
4710: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
4720: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
4730: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
4740: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4750: 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74  alloc(). *pzMast
4760: 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  er is.** set to 
4770: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d  point at the mem
4780: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
4790: 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
47a0: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73  caller must.** s
47b0: 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d  qliteFree() *pzM
47c0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
47d0: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
47e0: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
47f0: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
4800: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4810: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
4820: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
4830: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
4840: 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a  Journal(OsFile *
4850: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a  pJrnl, char **pz
4860: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
4870: 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20  c;.  u32 len;.  
4880: 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63  i64 szJ;.  u32 c
4890: 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ksum;.  int i;. 
48a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
48b0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
48c0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
48d0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
48e0: 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  /..  *pzMaster =
48f0: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
4900: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
4910: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
4920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4930: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
4940: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
4950: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
4960: 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69  nl, szJ-16);.  i
4970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4980: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a   ) return rc;. .
4990: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
49a0: 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a  s(pJrnl, &len);.
49b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
49c0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
49d0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
49e0: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75  its(pJrnl, &cksu
49f0: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
4a00: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
4a10: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
4a20: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
4a30: 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20  , aMagic, 8);.  
4a40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4a50: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
4a60: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
4a70: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
4a80: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
4a90: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
4aa0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
4ab0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4ac0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
4ad0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68   *pzMaster = (ch
4ae0: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
4af0: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  c(len+1);.  if( 
4b00: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
4b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4b20: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
4b30: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
4b40: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
4b50: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
4b60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4b70: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
4b80: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
4b90: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
4ba0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
4bb0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
4bc0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
4bd0: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
4be0: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
4bf0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
4c00: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
4c10: 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d  = (*pzMaster)[i]
4c20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
4c30: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
4c40: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
4c50: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
4c60: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
4c70: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
4c80: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
4c90: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
4ca0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
4cb0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
4cc0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
4cd0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
4ce0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
4cf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
4d00: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
4d10: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
4d20: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
4d30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
4d40: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
4d50: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
4d60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 28 2a 70 7a   = 0;.  }.  (*pz
4d70: 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27  Master)[len] = '
4d80: 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65 74 75 72  \0';.   .  retur
4d90: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4da0: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
4db0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
4dc0: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
4dd0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
4de0: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
4df0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
4e00: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
4e10: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
4e20: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
4e30: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
4e40: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
4e50: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
4e60: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
4e70: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
4e80: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
4e90: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
4ea0: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
4eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
4f10: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
4f20: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
4f30: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
4f40: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
4f50: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f60: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
4f70: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
4f80: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
4f90: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
4fa0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
4fb0: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
4fc0: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
4fd0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
4fe0: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
4ff0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5000: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5010: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5020: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5030: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5040: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
5050: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
5060: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
5070: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
5080: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5090: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
50a0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
50b0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
50c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
50d0: 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ff);.}../*.** Th
50e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
50f0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
5100: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5110: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
5120: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
5130: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
5140: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
5150: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
5160: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
5170: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
5180: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
5190: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
51a0: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
51b0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
51c0: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
51d0: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
51e0: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
51f0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
5200: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
5210: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
5220: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
5230: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
5240: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
5250: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
5260: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
5270: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
5280: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
5290: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
52a0: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
52b0: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
52c0: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
52d0: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
52e0: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
52f0: 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f  SZ - 24) bytes o
5300: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
5310: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5320: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
5330: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20  ger *pPager){.. 
5340: 20 69 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f   int rc = seekJo
5350: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
5360: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
5370: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
5380: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
5390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
53a0: 66 66 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ff;.  if( pPager
53b0: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
53c0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
53d0: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
53e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a  er->journalHdr;.
53f0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
5400: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
5410: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5420: 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45  r);..  /* FIX ME
5430: 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73  : .  **.  ** Pos
5440: 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65  sibly for a page
5450: 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  r not in no-sync
5460: 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
5470: 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20  al magic should 
5480: 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  not.  ** be writ
5490: 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69  ten until nRec i
54a0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70  s filled in as p
54b0: 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63  art of next sync
54c0: 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a  Journal(). .  **
54d0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d  .  ** Actually m
54e0: 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a  aybe the whole j
54f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68  ournal header sh
5500: 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20  ould be delayed 
5510: 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20  until that.  ** 
5520: 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f  point. Think abo
5530: 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  ut this..  */.  
5540: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
5550: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
5560: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5570: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
5580: 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69 66 28 20  Magic));..  if( 
5590: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
55a0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 52 65 63  .    /* The nRec
55b0: 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46   Field. 0xFFFFFF
55c0: 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a  FF for no-sync j
55d0: 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20  ournals. */.    
55e0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
55f0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5600: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20  Pager->noSync ? 
5610: 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b  0xffffffff : 0);
5620: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5630: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5640: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
5650: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
5660: 69 73 65 72 20 2a 2f 20 0a 20 20 20 20 73 71 6c  iser */ .    sql
5670: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
5680: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
5690: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
56a0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
56b0: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
56c0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
56d0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
56e0: 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nit);.  }.  if( 
56f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5700: 0a 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 69 74  .    /* The init
5710: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
5720: 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  e */.    rc = wr
5730: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5740: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5750: 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69  dbSize);.  }.  i
5760: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5770: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 61   ){.    /* The a
5780: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
5790: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
57a0: 65 73 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ess */.    rc = 
57b0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
57c0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
57d0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
57e0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75   }..  /* The jou
57f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20  rnal header has 
5800: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63  been written suc
5810: 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20  cessfully. Seek 
5820: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
5830: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5840: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
5850: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5860: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20  r sector..  */. 
5870: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5880: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5890: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
58a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
58b0: 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20  urnalOff-1);.   
58c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
58d0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  rite(&pPager->jf
58e0: 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20  d, "\000", 1);. 
58f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5900: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
5910: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
5920: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
5930: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
5940: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
5950: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
5960: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
5970: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
5980: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
5990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
59a0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
59b0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
59c0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
59d0: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
59e0: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
59f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
5a00: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
5a10: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
5a20: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
5a30: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
5a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
5a50: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
5a60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
5a70: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
5a80: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
5a90: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
5aa0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
5ab0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
5ac0: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
5ad0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
5ae0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
5af0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
5b00: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
5b10: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
5b20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
5b30: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
5b40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5b50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
5b60: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
5b70: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
5b80: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
5b90: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
5ba0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
5bb0: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
5bc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
5bd0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
5be0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
5bf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
5c00: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
5c10: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
5c20: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
5c30: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
5c40: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
5c50: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
5c60: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
5c70: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
5c80: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
5c90: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
5ca0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
5cb0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
5cc0: 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ader */..  rc = 
5cd0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
5ce0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
5cf0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5d00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
5d10: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
5d20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
5d30: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
5d40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5d50: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
5d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
5d70: 64 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  d(&pPager->jfd, 
5d80: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
5d90: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
5da0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
5db0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
5dc0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
5dd0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
5de0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
5df0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
5e00: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
5e10: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
5e20: 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20  ->jfd, pNRec);. 
5e30: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5e40: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
5e50: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
5e60: 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63  >jfd, &pPager->c
5e70: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28  ksumInit);.  if(
5e80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5e90: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5ea0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5eb0: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
5ec0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
5ed0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
5ee0: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
5ef0: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
5f00: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
5f10: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
5f20: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
5f30: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
5f40: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
5f50: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
5f60: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
5f70: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
5f80: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
5f90: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
5fa0: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
5fb0: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
5fc0: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
5fd0: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
5fe0: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
5ff0: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
6000: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
6010: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
6020: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
6030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6040: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6050: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6060: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6070: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6080: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6090: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
60a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
60b0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
60c0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
60d0: 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72  nalOff);.  retur
60e0: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
60f0: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
6100: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
6110: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
6120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
6130: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
6140: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
6150: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
6160: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6170: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
6180: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
6190: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
61a0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
61b0: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
61c0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
61d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
61e0: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
61f0: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
6200: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
6210: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
6220: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
6230: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
6240: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
6250: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
6260: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
6270: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
6280: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
6290: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
62a0: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
62b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
62c0: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
62d0: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
62e0: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
62f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6300: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
6310: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
6320: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
6330: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
6340: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
6350: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
6360: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
6370: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
6380: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
6390: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
63a0: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32  .  int i; .  u32
63b0: 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20   cksum = 0; ..  
63c0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
63d0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
63e0: 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r) return SQLITE
63f0: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
6400: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
6410: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
6420: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
6430: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
6440: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
6450: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
6460: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
6470: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
6480: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
6490: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
64a0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
64b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
64c0: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
64d0: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
64e0: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
64f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
6500: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
6510: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
6520: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
6530: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
6540: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6550: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
6560: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6570: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
6580: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
6590: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
65a0: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
65b0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
65c0: 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a  r->jfd, PAGER_MJ
65d0: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a  _PGNO(pPager));.
65e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
65f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6600: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6610: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
6620: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
6630: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
6640: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6650: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72  n rc;..  rc = wr
6660: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
6670: 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20  r->jfd, len);.  
6680: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6690: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
66a0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
66b0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
66c0: 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72   cksum);.  if( r
66d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
66e0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
66f0: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6700: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
6710: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6720: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6730: 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ic));.  pPager->
6740: 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
6750: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6760: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
6770: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
6780: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
6790: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
67a0: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
67b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
67c0: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
67d0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
67e0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
67f0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
6800: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
6810: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
6820: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
6830: 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
6840: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
6850: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
6860: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
6870: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
6880: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
6890: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
68a0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
68b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
68c0: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
68d0: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
68e0: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
68f0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
6900: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
6910: 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70  >pPager;.  if( p
6920: 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74  Pg->inStmt ) ret
6930: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
6940: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  Pg->pPrevStmt==0
6950: 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74   && pPg->pNextSt
6960: 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  mt==0 );.  pPg->
6970: 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20  pPrevStmt = 0;. 
6980: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74   if( pPager->pSt
6990: 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  mt ){.    pPager
69a0: 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  ->pStmt->pPrevSt
69b0: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  mt = pPg;.  }.  
69c0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
69d0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a   pPager->pStmt;.
69e0: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
69f0: 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e  = pPg;.  pPg->in
6a00: 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74  Stmt = 1;.}.stat
6a10: 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d  ic void page_rem
6a20: 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69  ove_from_stmt_li
6a30: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
6a40: 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74    if( !pPg->inSt
6a50: 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  mt ) return;.  i
6a60: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  f( pPg->pPrevStm
6a70: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
6a80: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d   pPg->pPrevStmt-
6a90: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20  >pNextStmt==pPg 
6aa0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
6ab0: 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74  vStmt->pNextStmt
6ac0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
6ad0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
6ae0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
6af0: 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20  ger->pStmt==pPg 
6b00: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
6b10: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d  er->pStmt = pPg-
6b20: 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a  >pNextStmt;.  }.
6b30: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
6b40: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
6b50: 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  rt( pPg->pNextSt
6b60: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70  mt->pPrevStmt==p
6b70: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
6b80: 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53  NextStmt->pPrevS
6b90: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  tmt = pPg->pPrev
6ba0: 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Stmt;.  }.  pPg-
6bb0: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
6bc0: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
6bd0: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53   = 0;.  pPg->inS
6be0: 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  tmt = 0;.}../*.*
6bf0: 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e  * Find a page in
6c00: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
6c10: 67 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e  given its page n
6c20: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a  umber.  Return.*
6c30: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
6c40: 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20  he page or NULL 
6c50: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
6c60: 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
6c70: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
6c80: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
6c90: 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
6ca0: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
6cb0: 68 5b 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  h[pager_hash(pgn
6cc0: 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  o)];.  while( p 
6cd0: 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f  && p->pgno!=pgno
6ce0: 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   ){.    p = p->p
6cf0: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
6d00: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
6d10: 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ** Unlock the da
6d20: 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72  tabase and clear
6d30: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
6d40: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
6d50: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
6d60: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
6d70: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
6d80: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
6d90: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
6da0: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
6db0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
6dc0: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
6dd0: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
6de0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
6df0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
6e00: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
6e10: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
6e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
6e30: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
6e40: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
6e50: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
6e60: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
6e70: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
6e80: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
6e90: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
6ea0: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
6eb0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50  e(pPg);.  }.  pP
6ec0: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
6ed0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
6ee0: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
6ef0: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
6f00: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
6f10: 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  l = 0;.  memset(
6f20: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
6f30: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
6f40: 3e 61 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67  >aHash));.  pPag
6f50: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
6f60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
6f70: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
6f80: 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
6f90: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
6fa0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73  pPager);.  }.  s
6fb0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
6fc0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
6fd0: 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
6fe0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
6ff0: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
7000: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70  dbSize = -1;.  p
7010: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
7020: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
7030: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
7040: 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  0 );.}../*.** Wh
7050: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7060: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
7070: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
7080: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
7090: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
70a0: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
70b0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
70c0: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
70d0: 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68  e releases.** th
70e0: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
70f0: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
7100: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
7110: 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f  s place.  The jo
7120: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73  urnal.** file is
7130: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f   deleted and clo
7140: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  sed..**.** TODO:
7150: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
7160: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
7170: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
7180: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
7190: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
71a0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
71b0: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
71c0: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
71d0: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
71e0: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
71f0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
7200: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
7210: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65  unwritelock(Page
7220: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7230: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
7240: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
7250: 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50  EMDB );.  if( pP
7260: 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
7270: 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
72a0: 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
72b0: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
72c0: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
72d0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
72e0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
72f0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
7300: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
7310: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
7320: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
7330: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7340: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7350: 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  jfd);.    pPager
7360: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
7370: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  0;.    sqlite3Os
7380: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
7390: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
73a0: 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
73b0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->aInJournal );.
73c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
73d0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
73e0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
73f0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
7400: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
7410: 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
7420: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
7430: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
7440: 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
7450: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
7460: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
7470: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
7480: 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
7490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
74a0: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
74b0: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
74c0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
74d0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ==0 );.  }.  rc 
74e0: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
74f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
7500: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
7510: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7520: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
7530: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7540: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7550: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
7560: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7570: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
7580: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
7590: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
75a0: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
75b0: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
75c0: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
75d0: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
75e0: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
75f0: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
7600: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
7610: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
7620: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
7630: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
7640: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
7650: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
7660: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
7670: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
7680: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
7690: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
76a0: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
76b0: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
76c0: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
76d0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
76e0: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
76f0: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
7700: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
7710: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
7720: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
7730: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
7740: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
7750: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
7760: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
7770: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
7780: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
7790: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
77a0: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
77b0: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
77c0: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
77d0: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
77e0: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
77f0: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
7800: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
7810: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
7820: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
7830: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
7840: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
7850: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
7860: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
7870: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
7880: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
7890: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
78a0: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
78b0: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
78c0: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
78d0: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
78e0: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
78f0: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
7900: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
7910: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
7920: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
7930: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
7940: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
7950: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
7960: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
7970: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
7980: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
7990: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
79a0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
79b0: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  o, const char *a
79c0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
79d0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
79e0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
79f0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
7a00: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
7a10: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
7a20: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
7a30: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
7a40: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
7a60: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
7a70: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
7a80: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
7a90: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
7aa0: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
7ab0: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
7ac0: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
7ad0: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
7ae0: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
7af0: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
7b00: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
7b10: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
7b20: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7b30: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
7b40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
7b50: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
7b60: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
7b70: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
7b80: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
7b90: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
7ba0: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
7bb0: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
7bc0: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
7bd0: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
7c00: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
7c10: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
7c20: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
7c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
7c40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
7c50: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
7c60: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
7c90: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
7ca0: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
7cb0: 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ata[SQLITE_MAX_P
7cc0: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54  AGE_SIZE];  /* T
7cd0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
7ce0: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 72 63 20  a page */..  rc 
7cf0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
7d00: 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  , &pgno);.  if( 
7d10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
7d20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
7d30: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
7d40: 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70 50 61  jfd, &aData, pPa
7d50: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7d60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
7d70: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
7d80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
7d90: 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d  alOff += pPager-
7da0: 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a  >pageSize + 4;..
7db0: 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
7dc0: 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65  king on the page
7dd0: 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
7de0: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49  important that I
7df0: 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a   originally.  **
7e00: 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20   thought.  If a 
7e10: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
7e20: 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a  curs while the j
7e30: 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20  ournal is being 
7e40: 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74  written,.  ** it
7e50: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76   could cause inv
7e60: 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65 20  alid data to be 
7e70: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
7e80: 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65   journal.  We ne
7e90: 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63  ed to.  ** detec
7ea0: 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64  t this invalid d
7eb0: 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20 70  ata (with high p
7ec0: 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20  robability) and 
7ed0: 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a  ignore it..  */.
7ee0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c    if( pgno==0 ||
7ef0: 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f   pgno==PAGER_MJ_
7f00: 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a  PGNO(pPager) ){.
7f10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7f20: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66  E_DONE;.  }.  if
7f30: 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64  ( pgno>(unsigned
7f40: 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
7f50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7f60: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
7f70: 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20  f( useCksum ){. 
7f80: 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69     rc = read32bi
7f90: 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b  ts(jfd, &cksum);
7fa0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
7fb0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
7fc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7fd0: 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61  += 4;.    if( pa
7fe0: 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
7ff0: 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29 21 3d  , pgno, aData)!=
8000: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
8010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
8020: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
8030: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8040: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
8050: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
8060: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
8070: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
8080: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
8090: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
80a0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
80b0: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
80c0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
80d0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
80e0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
80f0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
8100: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
8110: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
8120: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
8130: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
8140: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
8150: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
8160: 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20  If in EXCLUSIVE 
8170: 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75  state, then we u
8180: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
8190: 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73  cache if it exis
81a0: 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ts.  ** and the 
81b0: 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70  main file. The p
81c0: 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b  age is then mark
81d0: 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20  ed not dirty..  
81e0: 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  */.  pPg = pager
81f0: 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
8200: 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
8210: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
8220: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
8230: 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54 52 41 43  || pPg );.  TRAC
8240: 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E3("PLAYBACK %d 
8250: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
8260: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
8270: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  o);.  if( pPager
8280: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8290: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
82a0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
82b0: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
82c0: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
82d0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
82e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
82f0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
8300: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
8310: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
8320: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
8330: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
8340: 64 20 65 76 65 72 20 62 65 20 72 6f 6c 6c 65 64  d ever be rolled
8350: 20 62 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e   back that is in
8360: 20 75 73 65 2c 20 65 78 63 65 70 74 20 66 6f 72   use, except for
8370: 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 31 20 77   page.    ** 1 w
8380: 68 69 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20  hich is held in 
8390: 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
83a0: 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e  keep the lock on
83b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
83c0: 20 20 2a 2a 20 61 63 74 69 76 65 2e 0a 20 20 20    ** active..   
83d0: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   */.    void *pD
83e0: 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
83f0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
8400: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
8410: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
8420: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
8430: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
8440: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
8450: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
8460: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
8470: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
8480: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
8490: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
84a0: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
84b0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
84c0: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
84d0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
84e0: 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
84f0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
8500: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
8510: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8520: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8530: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
8540: 0a 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65  .    CODEC(pPage
8550: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
8560: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
8570: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
8580: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
8590: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
85a0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
85b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
85c0: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
85d0: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
85e0: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
85f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
8600: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
8610: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
8620: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
8630: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
8640: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
8650: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8660: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
8670: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
8680: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
8690: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
86a0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
86b0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
86c0: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
86d0: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
86e0: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
86f0: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
8700: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
8710: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
8720: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
8730: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
8740: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
8750: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
8760: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
8770: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
8780: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
8790: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
87a0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
87b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
87c0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
87d0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
87e0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
87f0: 6c 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61  le master;.  cha
8800: 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r *zMasterJourna
8810: 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e  l = 0; /* Conten
8820: 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ts of master jou
8830: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
8840: 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  64 nMasterJourna
8850: 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  l;       /* Size
8860: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
8870: 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  al file */..  /*
8880: 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
8890: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
88a0: 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73  clusively in cas
88b0: 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  e some other pro
88c0: 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e  cess.  ** is run
88d0: 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ning this routin
88e0: 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74  e also. Not that
88f0: 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75   it makes too mu
8900: 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20  ch difference.. 
8910: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61   */.  memset(&ma
8920: 73 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ster, 0, sizeof(
8930: 6d 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d  master));.  rc =
8940: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
8950: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
8960: 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  &master);.  if( 
8970: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8980: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8990: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
89a0: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
89b0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
89c0: 26 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65  &master, &nMaste
89d0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  rJournal);.  if(
89e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
89f0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
8a00: 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73  out;..  if( nMas
8a10: 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a  terJournal>0 ){.
8a20: 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e      char *zJourn
8a30: 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  al;.    char *zM
8a40: 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20  asterPtr = 0;.. 
8a50: 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65     /* Load the e
8a60: 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75  ntire master jou
8a70: 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73  rnal file into s
8a80: 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72  pace obtained fr
8a90: 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  om.    ** sqlite
8aa0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69  Malloc() and poi
8ab0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74  nted to by zMast
8ac0: 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  erJournal. .    
8ad0: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  */.    zMasterJo
8ae0: 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29  urnal = (char *)
8af0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61  sqliteMalloc(nMa
8b00: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
8b10: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
8b20: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
8b30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8b40: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
8b50: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
8b60: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
8b70: 65 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72  e3OsRead(&master
8b80: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
8b90: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
8ba0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
8bb0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
8bc0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
8bd0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
8be0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
8bf0: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
8c00: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
8c10: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
8c20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
8c30: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
8c40: 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  sts(zJournal) ){
8c50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
8c60: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
8c70: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
8c80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8c90: 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
8ca0: 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
8cb0: 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
8cc0: 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
8cd0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
8ce0: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
8cf0: 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
8d00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
8d10: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
8d20: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
8d30: 4f 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a  OsFile journal;.
8d40: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
8d50: 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a  &journal, 0, siz
8d60: 65 6f 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20  eof(journal));. 
8d70: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8d80: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
8d90: 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75  y(zJournal, &jou
8da0: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
8db0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
8dd0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8de0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
8df0: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
8e00: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75  sterJournal(&jou
8e10: 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74  rnal, &zMasterPt
8e20: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
8e30: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72  te3OsClose(&jour
8e40: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
8e50: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8e60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
8e70: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
8e80: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
8e90: 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 50      if( zMasterP
8ea0: 74 72 20 26 26 20 21 73 74 72 63 6d 70 28 7a 4d  tr && !strcmp(zM
8eb0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
8ec0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
8ed0: 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74  /* We have a mat
8ee0: 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74  ch. Do not delet
8ef0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8f00: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
8f10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
8f20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
8f30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8f40: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20      zJournal += 
8f50: 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c  (strlen(zJournal
8f60: 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
8f70: 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65    .  sqlite3OsDe
8f80: 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a  lete(zMaster);..
8f90: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
8fa0: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
8fb0: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
8fc0: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  eFree(zMasterJou
8fd0: 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
8fe0: 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29  f( master_open )
8ff0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
9000: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20  lose(&master);. 
9010: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9020: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76  }../*.** Make ev
9030: 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20  ery page in the 
9040: 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68  cache agree with
9050: 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b   what is on disk
9060: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
9070: 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65  s,.** reread the
9080: 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74   disk to reset t
9090: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
90a0: 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  cache..**.** Thi
90b0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
90c0: 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c  led after a roll
90d0: 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f  back in which so
90e0: 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20  me of the dirty 
90f0: 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68  cache.** pages h
9100: 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72  ad never been wr
9110: 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73  itten out to dis
9120: 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72  k.  We need to r
9130: 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  oll back the.** 
9140: 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e  cache content an
9150: 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61  d the easiest wa
9160: 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20  y to do that is 
9170: 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c  to reread the ol
9180: 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63  d content.** bac
9190: 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e  k from the disk.
91a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
91b0: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
91c0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
91d0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
91e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
91f0: 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d  E_OK;.  for(pPg=
9200: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
9210: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
9220: 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20  tAll){.    char 
9230: 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f  zBuf[SQLITE_MAX_
9240: 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  PAGE_SIZE];.    
9250: 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20  if( !pPg->dirty 
9260: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9270: 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
9280: 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
9290: 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
92a0: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
92b0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  &pPager->fd, pPa
92c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
92d0: 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  64)(pPg->pgno-1)
92e0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
92f0: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
9300: 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70  ger->fd, zBuf, p
9310: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9320: 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
9330: 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20  REFETCH %d page 
9340: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
9350: 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
9360: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
9370: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9380: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42  CODEC(pPager, zB
9390: 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32  uf, pPg->pgno, 2
93a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
93b0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c      memset(zBuf,
93c0: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
93d0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
93e0: 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
93f0: 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66  0 || memcmp(zBuf
9400: 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
9410: 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
9420: 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20  geSize) ){.     
9430: 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
9440: 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66  _DATA(pPg), zBuf
9450: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9460: 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ze);.      if( p
9470: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
9480: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
9490: 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
94a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
94b0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
94c0: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ze);.      }else
94d0: 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
94e0: 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
94f0: 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
9500: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
9510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9520: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
9530: 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e  c = 0;.    pPg->
9540: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dirty = 0;.  }. 
9550: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9560: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
9570: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
9580: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
9590: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
95a0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
95b0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
95c0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
95d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
95e0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72 65  int nPage){.  re
95f0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72  turn sqlite3OsTr
9600: 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e  uncate(&pPager->
9610: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
9620: 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29  Size*(i64)nPage)
9630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
9640: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
9650: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
9660: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
9670: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
9680: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
9690: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
96a0: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
96b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
96c0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
96d0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
96e0: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
96f0: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
9700: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
9710: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
9720: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
9730: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9740: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9750: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
9760: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
9770: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
9780: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
9790: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
97a0: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
97b0: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
97c0: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
97d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
97e0: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
97f0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
9800: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
9810: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
9820: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
9830: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
9840: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
9850: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
9860: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
9870: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
9880: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
9890: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
98a0: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
98b0: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
98c0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
98d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
98e0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
98f0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
9900: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
9910: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
9920: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
9930: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
9940: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
9950: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
9960: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
9970: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
9980: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
9990: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
99a0: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
99b0: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
99c0: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
99d0: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
99e0: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
99f0: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
9a00: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
9a10: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
9a20: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
9a30: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
9a40: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
9a50: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
9a60: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
9a70: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
9a80: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
9a90: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
9aa0: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
9ab0: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
9ac0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
9ad0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
9ae0: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
9af0: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
9b00: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
9b10: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
9b20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9b30: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
9b40: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
9b50: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
9b60: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
9b70: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
9b80: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
9b90: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
9ba0: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
9bb0: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
9bc0: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
9bd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
9be0: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
9bf0: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
9c00: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
9c10: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
9c20: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
9c30: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
9c40: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
9c50: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
9c60: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
9c70: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
9c80: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
9c90: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
9ca0: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
9cb0: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
9cc0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
9cd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
9ce0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
9cf0: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
9d00: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
9d10: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
9d20: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
9d30: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
9d40: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
9d50: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
9d60: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
9d70: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
9d80: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
9d90: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
9da0: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
9db0: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
9dc0: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
9dd0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
9de0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
9df0: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
9e00: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
9e10: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
9e20: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
9e30: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
9e40: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
9e50: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
9e60: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
9e70: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
9e80: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
9e90: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
9ea0: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
9eb0: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
9ec0: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
9ed0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
9ee0: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
9ef0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
9f00: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
9f10: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
9f20: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
9f30: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
9f40: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
9f50: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
9f60: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
9f70: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
9f80: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
9f90: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
9fa0: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
9fb0: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
9fc0: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
9fd0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
9fe0: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
9ff0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
a000: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
a010: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
a020: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
a030: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
a040: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
a050: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
a060: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
a070: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
a080: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
a090: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
a0a0: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
a0b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
a0c0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
a0d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
a0e0: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
a0f0: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
a120: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
a130: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
a140: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
a150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a160: 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
a170: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20  ournal */.  int 
a180: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
a190: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
a1a0: 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d  nter */.  Pgno m
a1b0: 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  xPg = 0;        
a1c0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
a1d0: 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  e original file 
a1e0: 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e  in pages */.  in
a1f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
a200: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
a210: 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f   code of a subro
a220: 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20  utine */.  char 
a230: 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
a240: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d      /* Name of m
a250: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a260: 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20  le if any */..  
a270: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
a280: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
a290: 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
a2a0: 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
a2b0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
a2c0: 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
a2d0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
a2e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
a2f0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
a300: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
a310: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
a320: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
a330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
a340: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
a350: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
a360: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a370: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
a380: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
a390: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
a3a0: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
a3b0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
a3c0: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
a3d0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
a3e0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
a3f0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
a400: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
a410: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
a420: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
a430: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
a440: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
a450: 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67 65  erJournal(&pPage
a460: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
a470: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
a480: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
a490: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a4a0: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
a4b0: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
a4c0: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
a4d0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
a4e0: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
a4f0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
a500: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
a510: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
a520: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
a530: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
a540: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
a550: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
a560: 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  , 0);.  pPager->
a570: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
a580: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  /* This loop 
a590: 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65  terminates eithe
a5a0: 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a  r when the readJ
a5b0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c  ournalHdr() call
a5c0: 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51   returns.  ** SQ
a5d0: 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
a5e0: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  IO error occurs.
a5f0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
a600: 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  {..    /* Read t
a610: 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20  he next journal 
a620: 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20  header from the 
a630: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49  journal file.  I
a640: 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20  f there are.    
a650: 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  ** not enough by
a660: 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20  tes left in the 
a670: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a680: 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64   a complete head
a690: 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74  er, or.    ** it
a6a0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74   is corrupted, t
a6b0: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75  hen a process mu
a6c0: 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69  st of failed whi
a6d0: 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  le writing it.. 
a6e0: 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63     ** This indic
a6f0: 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72  ates nothing mor
a700: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  e needs to be ro
a710: 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a  lled back..    *
a720: 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a  /.    rc = readJ
a730: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
a740: 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d  , szJ, &nRec, &m
a750: 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  xPg);.    if( rc
a760: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a  !=SQLITE_OK ){ .
a770: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
a780: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
a790: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a7a0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
a7b0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
a7c0: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  back;.    }..   
a7d0: 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30   /* If nRec is 0
a7e0: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
a7f0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
a800: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
a810: 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72  ocess.    ** wor
a820: 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  king in no-sync 
a830: 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73  mode. This means
a840: 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f   that the rest o
a850: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  f the journal.  
a860: 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73    ** file consis
a870: 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65  ts of pages, the
a880: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a  re are no more j
a890: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20  ournal headers. 
a8a0: 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74  Compute.    ** t
a8b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
a8c0: 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61   based on this a
a8d0: 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  ssumption..    *
a8e0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
a8f0: 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20  0xffffffff ){.  
a900: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
a910: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
a920: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a930: 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
a940: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f  nRec = (szJ - JO
a950: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
a960: 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47  ger))/JOURNAL_PG
a970: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
a980: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
a990: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
a9a0: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
a9b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
a9c0: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
a9d0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
a9e0: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
a9f0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
aa00: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
aa10: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
aa20: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
aa30: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
aa40: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
aa50: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
aa60: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
aa70: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
aa80: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
aa90: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
aaa0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
aab0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
aac0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
aad0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
aae0: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
aaf0: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
ab00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63      }..    /* rc
ab10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
ab20: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a  (&pPager->jfd, J
ab30: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ab40: 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69  ager)); */.    i
ab50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ab60: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
ab70: 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  back;.  .    /* 
ab80: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
ab90: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
aba0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
abb0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
abc0: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
abd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
abe0: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
abf0: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
ac00: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
ac10: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
ac20: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
ac30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ac40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
ac50: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
ac60: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
ac70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
ac80: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ac90: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
aca0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
acb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
acc0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
acd0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ace0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
acf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
ad00: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
ad10: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
ad20: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
ad30: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
ad40: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
ad50: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
ad60: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
ad70: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
ad80: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
ad90: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
ada0: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
adb0: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
adc0: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
add0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
ade0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
adf0: 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70  (pPager);..end_p
ae00: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
ae10: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ae20: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
ae30: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
ae40: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
ae50: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
ae60: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
ae70: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
ae80: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
ae90: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
aea0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
aeb0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
aec0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
aed0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 65  er journal. If e
aee0: 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f 63  rrors .    ** oc
aef0: 63 75 72 20 64 75 72 69 6e 67 20 74 68 69 73 20  cur during this 
af00: 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65 20  process, ignore 
af10: 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  them..    */.   
af20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
af30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  OK ){.      page
af40: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
af50: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
af60: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
af70: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
af80: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
af90: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
afa0: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
afb0: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
afc0: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
afd0: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
afe0: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
aff0: 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45 52   different PAGER
b000: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a  _SECTOR_SIZE.  *
b010: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
b020: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
b030: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
b040: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
b050: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
b060: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
b070: 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e  R_SIZE;.  return
b080: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c   rc;.}../*.** Pl
b090: 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  ayback the state
b0a0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
b0b0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69  .** This is simi
b0c0: 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  lar to playing b
b0d0: 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
b0e0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20  ion journal but 
b0f0: 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78  with.** a few ex
b100: 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a  tra twists..**.*
b110: 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75  *    (1)  The nu
b120: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
b130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b140: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
b150: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68  of.**         th
b160: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  e statement is s
b170: 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d  tored in pPager-
b180: 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69  >stmtSize, not i
b190: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
b1a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
b1b0: 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  self..**.**    (
b1c0: 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  2)  In addition 
b1d0: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
b1e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b1f0: 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20  urnal, also.**  
b200: 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20         playback 
b210: 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65  all pages of the
b220: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
b230: 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a  rnal beginning.*
b240: 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66  *         at off
b250: 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  set pPager->stmt
b260: 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  JSize..*/.static
b270: 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f   int pager_stmt_
b280: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
b290: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
b2a0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
b2b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b2c0: 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20  he full journal 
b2d0: 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b  */.  i64 hdrOff;
b2e0: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b300: 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73  umber of Records
b310: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b330: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
b340: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73  /.  int rc;..  s
b350: 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ = pPager->jou
b360: 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66  rnalOff;.#ifndef
b370: 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20   NDEBUG .  {.   
b380: 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20   i64 os_szJ;.   
b390: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
b3a0: 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
b3b0: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
b3c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b3d0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
b3e0: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
b3f0: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
b400: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
b410: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
b420: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
b430: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
b440: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20  header written. 
b450: 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65   ** this stateme
b460: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
b470: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
b480: 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75  e file if no jou
b490: 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  rnal.  ** header
b4a0: 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20   was written..  
b4b0: 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50  */.  hdrOff = pP
b4c0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
b4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
b4e0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20  er->fullSync || 
b4f0: 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28  !hdrOff );.  if(
b500: 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20   !hdrOff ){.    
b510: 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  hdrOff = szJ;.  
b520: 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e 63  }.  ..  /* Trunc
b530: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
b540: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
b550: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
b560: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
b570: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
b580: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
b590: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
b5a0: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
b5b0: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
b5c0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
b5d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
b5e0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
b5f0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
b600: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
b610: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
b620: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
b630: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
b640: 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  k(&pPager->stfd,
b650: 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50   0);.  nRec = pP
b660: 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a  ager->stmtNRec;.
b670: 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69    .  /* Copy ori
b680: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
b690: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
b6a0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63   journal and bac
b6b0: 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  k into the.  ** 
b6c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
b6d0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74  Note that the st
b6e0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
b6f0: 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20  omits checksums 
b700: 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72  from.  ** each r
b710: 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65  ecord since powe
b720: 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65  r-failure recove
b730: 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74  ry is not import
b740: 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74  ant to statement
b750: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a  .  ** journals..
b760: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65    */.  for(i=nRe
b770: 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  c-1; i>=0; i--){
b780: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b790: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
b7a0: 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
b7b0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
b7c0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
b7d0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
b7e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b7f0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
b800: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
b810: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
b820: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
b830: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
b840: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
b850: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
b860: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
b870: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b880: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
b890: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
b8a0: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
b8b0: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
b8c0: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
b8d0: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
b8e0: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
b8f0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
b900: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
b910: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
b920: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
b930: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
b940: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
b950: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
b960: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
b970: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
b980: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
b990: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
b9a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
b9b0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
b9c0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b9d0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
b9e0: 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
b9f0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ba00: 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73  {.    goto end_s
ba10: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ba20: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
ba30: 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  nalOff = pPager-
ba40: 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50  >stmtJSize;.  pP
ba50: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20  ager->cksumInit 
ba60: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b  = pPager->stmtCk
ba70: 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a  sum;.  assert( J
ba80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ba90: 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70  ager)<(pPager->p
baa0: 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20  ageSize+8) );.  
bab0: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
bac0: 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64  ournalOff <= (hd
bad0: 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61  rOff-(pPager->pa
bae0: 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20  geSize+8)) ){.  
baf0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
bb00: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
bb10: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
bb20: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
bb30: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
bb40: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
bb50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bb60: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
bb70: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
bb80: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
bb90: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
bba0: 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a  {.    u32 nRec;.
bbb0: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
bbc0: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
bbd0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
bbe0: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d  zJ, &nRec, &dumm
bbf0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
bc00: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bc10: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
bc20: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
bc30: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
bc40: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
bc50: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  }.    if( nRec==
bc60: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  0 ){.      nRec 
bc70: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
bc80: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
bc90: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
bca0: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
bcb0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
bcc0: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
bcd0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
bce0: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
bcf0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
bd00: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
bd10: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29  &pPager->jfd, 1)
bd20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bd30: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
bd40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
bd50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
bd60: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
bd70: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
bd80: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bd90: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
bda0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
bdb0: 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
bdc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
bdd0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
bde0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
bdf0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
be00: 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20  TE_CORRUPT;  /* 
be10: 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a  bkpt-CORRUPT */.
be20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
be30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
be40: 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
be50: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
be60: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
be70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
be80: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
be90: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
bea0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
beb0: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
bec0: 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  owed..**.** The 
bed0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 69  maximum number i
bee0: 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20 76  s the absolute v
bef0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50 61  alue of the mxPa
bf00: 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a  ge parameter..**
bf10: 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65   If mxPage is ne
bf20: 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53 79  gative, the noSy
bf30: 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f 20  nc flag is also 
bf40: 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79 70  set.  noSync byp
bf50: 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20 74  asses.** calls t
bf60: 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  o sqlite3OsSync(
bf70: 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72 75  ).  The pager ru
bf80: 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 77  ns much faster w
bf90: 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a  ith noSync on,.*
bfa0: 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70 65  * but if the ope
bfb0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
bfc0: 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
bfd0: 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65  s an abrupt powe
bfe0: 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20 74  r .** failure, t
bff0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c000: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
c010: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
c020: 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61 69  t and.** unrepai
c030: 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a 2a  rable state.  .*
c040: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
c050: 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69 7a  ger_set_cachesiz
c060: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
c070: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
c080: 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29 7b  if( mxPage>=0 ){
c090: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
c0a0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
c0b0: 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28 20  mpFile;.    if( 
c0c0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
c0d0: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
c0e0: 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65 7b  c = 0; .  }else{
c0f0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  .    pPager->noS
c100: 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78 50  ync = 1;.    mxP
c110: 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a 20  age = -mxPage;. 
c120: 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e   }.  if( mxPage>
c130: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
c140: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
c150: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
c160: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
c170: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
c180: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
c190: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
c1a0: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
c1b0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
c1c0: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
c1d0: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
c1e0: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
c1f0: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
c200: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
c210: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
c220: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
c230: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
c240: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
c250: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
c260: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
c270: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
c280: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
c290: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
c2a0: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
c2b0: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
c2c0: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
c2d0: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
c2e0: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
c2f0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
c300: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c310: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
c320: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
c330: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
c340: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
c350: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
c360: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
c370: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
c380: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
c390: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
c3a0: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
c3b0: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
c3c0: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
c3d0: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
c3e0: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
c3f0: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
c400: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
c410: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
c420: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
c430: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
c440: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
c450: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
c460: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
c470: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
c480: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
c490: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
c4a0: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
c4b0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
c4c0: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
c4d0: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
c4e0: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
c4f0: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
c500: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
c510: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
c520: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
c530: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
c540: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
c550: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
c560: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
c570: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
c580: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
c590: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
c5a0: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
c5b0: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
c5c0: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
c5d0: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
c5e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c5f0: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
c600: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
c610: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
c620: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
c630: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
c640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
c650: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
c660: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
c670: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
c680: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
c690: 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f  ager_set_safety_
c6a0: 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61  level(Pager *pPa
c6b0: 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b  ger, int level){
c6c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
c6d0: 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c  c =  level==1 ||
c6e0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
c6f0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
c700: 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33  lSync = level==3
c710: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
c720: 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61  pFile;.  if( pPa
c730: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
c740: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
c750: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65   0;.}../*.** Ope
c760: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
c770: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
c780: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
c790: 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a  into zName.** (z
c7a0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20  Name must be at 
c7b0: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
c7c0: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
c7d0: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
c7e0: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
c7f0: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
c800: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c810: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
c820: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
c830: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
c840: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
c850: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
c860: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
c870: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
c880: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
c890: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
c8a0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
c8b0: 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a  opentemp(char *z
c8c0: 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64  File, OsFile *fd
c8d0: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
c8e0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  ;.  int rc;.  do
c8f0: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
c900: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
c910: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
c920: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c930: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
c940: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
c950: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
c960: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
c970: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
c980: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
c990: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
c9a0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
c9b0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
c9c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
c9d0: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
c9e0: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
c9f0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
ca00: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
ca10: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
ca20: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
ca30: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
ca40: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
ca50: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
ca60: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
ca70: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
ca80: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
ca90: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
caa0: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
cab0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
cac0: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
cad0: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
cae0: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
caf0: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
cb00: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
cb10: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
cb20: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
cb30: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
cb40: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
cb50: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
cb60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
cb70: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
cb80: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
cb90: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
cba0: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
cbb0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
cbc0: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
cbd0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
cbe0: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
cbf0: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
cc00: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
cc10: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
cc20: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
cc30: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
cc40: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
cc50: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
cc60: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
cc70: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
cc80: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
cc90: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
cca0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
ccb0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
ccc0: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
ccd0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
cce0: 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  /.  int useJourn
ccf0: 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  al           /* 
cd00: 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72 6f  TRUE to use a ro
cd10: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
cd20: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  n this file */.)
cd30: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
cd40: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
cd50: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
cd60: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
cd70: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
cd80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cd90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
cda0: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
cdb0: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
cdc0: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
cdd0: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
cde0: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
cdf0: 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67 65  IZE];..  *ppPage
ce00: 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  r = 0;.  memset(
ce10: 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66  &fd, 0, sizeof(f
ce20: 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  d));.  if( sqlit
ce30: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
ce40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
ce50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
ce60: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
ce70: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   && zFilename[0]
ce80: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
ce90: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
cea0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
ceb0: 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f  zFilename,":memo
cec0: 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ry:")==0 ){.    
ced0: 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20    memDb = 1;.   
cee0: 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65     zFullPathname
cef0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
cf00: 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  "");.      rc = 
cf10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cf20: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
cf30: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
cf40: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
cf50: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
cf60: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
cf70: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
cf80: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
cf90: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
cfa0: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
cfb0: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
cfc0: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d  adOnly);.      }
cfd0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
cfe0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cff0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
d000: 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20  Temp, &fd);.    
d010: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
d020: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
d030: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
d040: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
d050: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
d060: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
d070: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
d080: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
d090: 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68    if( !zFullPath
d0a0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  name ){.    sqli
d0b0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
d0c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
d0d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
d0e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d0f0: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
d100: 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20  OsClose(&fd);.  
d110: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
d120: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
d130: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
d140: 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c    nameLen = strl
d150: 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  en(zFullPathname
d160: 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  );.  pPager = sq
d170: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
d180: 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61  of(*pPager) + na
d190: 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a  meLen*3 + 30 );.
d1a0: 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30 20    if( pPager==0 
d1b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
d1c0: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
d1d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
d1e0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
d1f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d200: 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 33  EM;.  }.  TRACE3
d210: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
d220: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
d230: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
d240: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69  );.  pPager->zFi
d250: 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
d260: 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50  &pPager[1];.  pP
d270: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
d280: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c   = &pPager->zFil
d290: 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d  ename[nameLen+1]
d2a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ;.  pPager->zJou
d2b0: 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e  rnal = &pPager->
d2c0: 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c  zDirectory[nameL
d2d0: 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28  en+1];.  strcpy(
d2e0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
d2f0: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
d300: 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  );.  strcpy(pPag
d310: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
d320: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
d330: 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b    for(i=nameLen;
d340: 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
d350: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
d360: 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
d370: 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
d380: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
d390: 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70   = 0;.  strcpy(p
d3a0: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
d3b0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
d3c0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
d3d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d3e0: 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e  strcpy(&pPager->
d3f0: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
d400: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a  ], "-journal");.
d410: 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66    pPager->fd = f
d420: 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  d;.#if OS_UNIX. 
d430: 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61 67   pPager->fd.pPag
d440: 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e  er = pPager;.#en
d450: 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  dif.  pPager->jo
d460: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
d470: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
d480: 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c  nal = useJournal
d490: 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50   && !memDb;.  pP
d4a0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
d4b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
d4c0: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70  mtInUse = 0;.  p
d4d0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
d4e0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
d4f0: 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
d500: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d510: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
d520: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50  _PAGE_SIZE;.  pP
d530: 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20  ager->psAligned 
d540: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
d550: 54 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  T(pPager->pageSi
d560: 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ze);.  pPager->s
d570: 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  tmtSize = 0;.  p
d580: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d590: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d5a0: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61  nPage = 0;.  pPa
d5b0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d5c0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  0;.  pPager->sta
d5d0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
d5e0: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  K;.  pPager->err
d5f0: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  Mask = 0;.  pPag
d600: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
d610: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
d620: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
d630: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
d640: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
d650: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
d660: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
d670: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
d680: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
d690: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
d6a0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d6b0: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
d6c0: 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
d6d0: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
d6e0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
d6f0: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
d700: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
d710: 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20   pPager->nExtra 
d720: 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e  = FORCE_ALIGNMEN
d730: 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61  T(nExtra);.  pPa
d740: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
d750: 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  = PAGER_SECTOR_S
d760: 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  IZE;.  pPager->p
d770: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
d780: 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  .  memset(pPager
d790: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
d7a0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
d7b0: 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d  ));.  *ppPager =
d7c0: 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
d7d0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d7e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
d7f0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
d800: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
d810: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75  ite3pager_set_bu
d820: 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20  syhandler(Pager 
d830: 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e  *pPager, BusyHan
d840: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
d850: 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70  er){.  pPager->p
d860: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42  BusyHandler = pB
d870: 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f  usyHandler;.}../
d880: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73  *.** Set the des
d890: 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73  tructor for this
d8a0: 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20   pager.  If not 
d8b0: 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75  NULL, the destru
d8c0: 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a  ctor is called.*
d8d0: 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  * when the refer
d8e0: 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61  ence count on ea
d8f0: 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20  ch page reaches 
d900: 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72  zero.  The destr
d910: 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20  uctor can.** be 
d920: 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70  used to clean up
d930: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
d940: 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e  the extra segmen
d950: 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61  t appended to ea
d960: 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ch page..**.** T
d970: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  he destructor is
d980: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61   not called as a
d990: 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70   result sqlite3p
d9a0: 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a  ager_close().  .
d9b0: 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
d9c0: 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
d9d0: 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  y sqlite3pager_u
d9e0: 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  nref()..*/.void 
d9f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
da00: 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65  _destructor(Page
da10: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
da20: 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69  (*xDesc)(void*,i
da30: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
da40: 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44  xDestructor = xD
da50: 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  esc;.}../*.** Se
da60: 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  t the reinitiali
da70: 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67  zer for this pag
da80: 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c  er.  If not NULL
da90: 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69  , the reinitiali
daa0: 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  zer.** is called
dab0: 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   when the conten
dac0: 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63  t of a page in c
dad0: 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
dae0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
daf0: 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72  .** value as a r
db00: 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62  esult of a rollb
db10: 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61  ack.  The callba
db20: 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d  ck gives higher-
db30: 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e  level code.** an
db40: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
db50: 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52  restore the EXTR
db60: 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72  A section to agr
db70: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
db80: 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74  ored.** page dat
db90: 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
dba0: 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e  e3pager_set_rein
dbb0: 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  iter(Pager *pPag
dbc0: 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  er, void (*xRein
dbd0: 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b  it)(void*,int)){
dbe0: 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  .  pPager->xRein
dbf0: 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a  iter = xReinit;.
dc00: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
dc10: 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
dc20: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
dc30: 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68 61  must only be cha
dc40: 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63 61  nged when the ca
dc50: 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  che is empty..*/
dc60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
dc70: 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28  er_set_pagesize(
dc80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dc90: 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
dca0: 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
dcb0: 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
dcc0: 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
dcd0: 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50 61  GE_SIZE );.  pPa
dce0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
dcf0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  pageSize;.  pPag
dd00: 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d 20  er->psAligned = 
dd10: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
dd20: 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  pageSize);.}../*
dd30: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
dd40: 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
dd50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
dd60: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
dd70: 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
dd80: 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  est points to.  
dd90: 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
dda0: 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f  g is done..*/.vo
ddb0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
ddc0: 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28  read_fileheader(
ddd0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dde0: 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63  nt N, unsigned c
ddf0: 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d  har *pDest){.  m
de00: 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
de10: 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
de20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
de30: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
de40: 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  >fd, 0);.    sql
de50: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
de60: 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
de70: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
de80: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
de90: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
dea0: 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
deb0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
dec0: 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a  h.** pPager..*/.
ded0: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
dee0: 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  _pagecount(Pager
def0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
df00: 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   n;.  assert( pP
df10: 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
df20: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
df30: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
df40: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
df50: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
df60: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
df70: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
df80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
df90: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
dfa0: 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  |= PAGER_ERR_DIS
dfb0: 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  K;.    return 0;
dfc0: 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67  .  }.  n /= pPag
dfd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
dfe0: 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 3d  if( !MEMDB && n=
dff0: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
e000: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
e010: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
e020: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
e030: 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
e040: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e050: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a  dbSize = n;.  }.
e060: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
e070: 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
e080: 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
e090: 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
e0a0: 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a  al(Pager*);.../*
e0b0: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66  .** Unlink pPg f
e0c0: 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
e0d0: 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68  ain. Also set th
e0e0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  e page number to
e0f0: 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a   0 to indicate.*
e100: 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  * that the page 
e110: 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  is not part of a
e120: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54  ny hash chain. T
e130: 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20  his is required 
e140: 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73  because the.** s
e150: 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
e160: 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
e170: 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
e180: 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
e190: 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
e1a0: 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
e1b0: 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
e1c0: 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
e1d0: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
e1e0: 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
e1f0: 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
e200: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
e210: 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pgno==0 ){.    /
e220: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75  * If the page nu
e230: 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68  mber is zero, th
e240: 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20  en this page is 
e250: 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20  not in any hash 
e260: 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65  chain. */.    re
e270: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
e280: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
e290: 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
e2a0: 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
e2b0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
e2c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
e2d0: 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
e2e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e2f0: 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61  ->aHash[pager_ha
e300: 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d  sh(pPg->pgno)]!=
e310: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pPg );.    pPg->
e320: 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74  pPrevHash->pNext
e330: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Hash = pPg->pNex
e340: 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tHash;.  }else{.
e350: 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65      int h = page
e360: 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f  r_hash(pPg->pgno
e370: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e380: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d  Pager->aHash[h]=
e390: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
e3a0: 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
e3b0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
e3c0: 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   }..  pPg->pgno 
e3d0: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
e3e0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
e3f0: 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
e400: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
e410: 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
e420: 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
e430: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
e440: 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
e450: 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
e460: 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
e470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e480: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
e490: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
e4a0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
e4b0: 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
e4c0: 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
e4d0: 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
e4e0: 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
e4f0: 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
e500: 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
e510: 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
e520: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
e530: 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
e540: 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
e550: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
e560: 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
e570: 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
e580: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
e590: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
e5a0: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
e5b0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
e5c0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
e5d0: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
e5e0: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
e5f0: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
e600: 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
e610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
e620: 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
e630: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
e640: 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
e650: 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
e660: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
e670: 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
e680: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
e690: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
e6a0: 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
e6b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e6c0: 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
e6d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
e6e0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
e6f0: 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
e700: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
e710: 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
e720: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
e730: 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
e740: 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
e750: 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
e760: 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
e770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e780: 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
e790: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
e7a0: 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
e7b0: 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
e7c0: 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
e7d0: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
e7e0: 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
e7f0: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
e800: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
e810: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
e820: 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
e830: 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
e840: 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
e850: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
e860: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
e870: 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
e880: 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
e890: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
e8a0: 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
e8b0: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
e8c0: 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
e8d0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
e8e0: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
e8f0: 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
e900: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
e910: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e920: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
e930: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
e940: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
e950: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
e960: 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
e970: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
e980: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
e990: 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
e9a0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
e9b0: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
e9c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
e9d0: 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
e9e0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
e9f0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ea00: 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
ea10: 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
ea20: 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
ea30: 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
ea40: 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
ea50: 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
ea60: 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
ea70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ea80: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
ea90: 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
eaa0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
eab0: 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
eac0: 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
ead0: 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
eae0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
eaf0: 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
eb00: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
eb10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
eb20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
eb30: 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
eb40: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
eb50: 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
eb60: 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
eb70: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
eb80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
eb90: 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
eba0: 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
ebb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ebc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
ebd0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
ebe0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
ebf0: 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
ec00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
ec10: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
ec20: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
ec30: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ec40: 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
ec50: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
ec60: 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
ec70: 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
ec80: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
ec90: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
eca0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
ecb0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
ecc0: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
ecd0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
ece0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
ecf0: 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
ed00: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
ed10: 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
ed20: 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
ed30: 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
ed40: 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
ed50: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
ed60: 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
ed70: 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
ed80: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
ed90: 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
eda0: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
edb0: 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
edc0: 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67  3pager_close(Pag
edd0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ede0: 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
edf0: 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50 61  t;.  switch( pPa
ee00: 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20  ger->state ){.  
ee10: 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45 53    case PAGER_RES
ee20: 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20  ERVED:.    case 
ee30: 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20  PAGER_SYNCED: . 
ee40: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45 58     case PAGER_EX
ee50: 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20  CLUSIVE: {.     
ee60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
ee70: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
ee80: 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
ee90: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
eea0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
eeb0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
eec0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eed0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
eee0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
eef0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ef00: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
ef10: 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20  AGER_SHARED: {. 
ef20: 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
ef30: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ef40: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
ef50: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
ef60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ef70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ef80: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
ef90: 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
efa0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
efb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
efc0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
efd0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
efe0: 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ){.#ifndef NDEBU
eff0: 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  G.    if( MEMDB 
f000: 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
f010: 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
f020: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
f030: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
f040: 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
f050: 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
f060: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
f070: 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
f080: 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
f090: 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
f0a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65  }.#endif.    pNe
f0b0: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
f0c0: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
f0d0: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54  ee(pPg);.  }.  T
f0e0: 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
f0f0: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
f100: 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  er));.  sqlite3O
f110: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
f120: 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  fd);.  assert( p
f130: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
f140: 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65  en==0 );.  /* Te
f150: 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
f160: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
f170: 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
f180: 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
f190: 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
f1a0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
f1b0: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
f1c0: 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
f1d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 7a  .  if( pPager->z
f1e0: 46 69 6c 65 6e 61 6d 65 21 3d 28 63 68 61 72 2a  Filename!=(char*
f1f0: 29 26 70 50 61 67 65 72 5b 31 5d 20 29 7b 0a 20  )&pPager[1] ){. 
f200: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20     assert( 0 ); 
f210: 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65   /* Cannot happe
f220: 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46  n */.    sqliteF
f230: 72 65 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ree(pPager->zFil
f240: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  ename);.    sqli
f250: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 7a  teFree(pPager->z
f260: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71  Journal);.    sq
f270: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
f280: 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
f290: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
f2a0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
f2b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f2c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
f2d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
f2e0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
f2f0: 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
f300: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
f310: 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
f320: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
f330: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
f340: 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
f350: 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
f360: 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
f370: 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
f380: 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
f390: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
f3a0: 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
f3b0: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
f3c0: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
f3d0: 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
f3e0: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
f3f0: 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
f400: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
f410: 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
f420: 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
f430: 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
f440: 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
f450: 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
f460: 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
f470: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
f480: 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
f490: 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
f4a0: 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
f4b0: 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
f4c0: 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
f4d0: 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
f4e0: 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
f4f0: 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
f500: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
f510: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
f520: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
f530: 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
f540: 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
f550: 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
f560: 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
f570: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
f580: 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
f590: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
f5a0: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
f5b0: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
f5c0: 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
f5d0: 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
f5e0: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
f5f0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
f600: 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
f610: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
f620: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
f630: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
f640: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
f650: 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
f660: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
f670: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
f680: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
f690: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
f6a0: 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
f6b0: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
f6c0: 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
f6d0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
f6e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f6f0: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
f700: 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
f710: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
f720: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
f730: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
f740: 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
f750: 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
f760: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
f770: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
f780: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
f790: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
f7a0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
f7b0: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
f7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f7d0: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
f7e0: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
f7f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
f800: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
f810: 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
f820: 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
f830: 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
f840: 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
f850: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
f860: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
f870: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
f880: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
f890: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
f8a0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
f8b0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
f8c0: 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
f8d0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
f8e0: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
f8f0: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
f900: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
f910: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
f920: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
f930: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
f940: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
f950: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
f960: 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
f970: 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
f980: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
f990: 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
f9a0: 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
f9b0: 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
f9c0: 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
f9d0: 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
f9e0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
f9f0: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
fa00: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
fa10: 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
fa20: 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
fa30: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
fa40: 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
fa50: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
fa60: 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
fa70: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
fa80: 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
fa90: 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
faa0: 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
fab0: 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
fac0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
fad0: 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
fae0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
faf0: 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
fb00: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
fb10: 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
fb20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
fb30: 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
fb40: 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
fb50: 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
fb60: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
fb70: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
fb80: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
fb90: 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
fba0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
fbb0: 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
fbc0: 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
fbd0: 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
fbe0: 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
fbf0: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
fc00: 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
fc10: 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
fc20: 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
fc30: 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
fc40: 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
fc50: 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
fc60: 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
fc70: 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
fc80: 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
fc90: 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
fca0: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
fcb0: 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
fcc0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
fcd0: 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
fce0: 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
fcf0: 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
fd00: 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
fd10: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
fd20: 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
fd30: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fd40: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
fd50: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
fd60: 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
fd70: 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
fd80: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
fd90: 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
fda0: 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
fdb0: 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
fdc0: 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
fdd0: 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
fde0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
fdf0: 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
fe00: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
fe10: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
fe20: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
fe30: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
fe40: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
fe50: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
fe60: 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
fe70: 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
fe80: 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
fe90: 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
fea0: 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
feb0: 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
fec0: 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
fed0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
fee0: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
fef0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
ff00: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
ff10: 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
ff20: 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
ff30: 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
ff40: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
ff50: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
ff60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
ff70: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ff80: 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
ff90: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ffa0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
ffb0: 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
ffc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
ffd0: 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
ffe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
fff0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10000 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
10010 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
10020 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
10030 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
10040 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10050 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
10060 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
10070 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
10080 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
10090 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
100a0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
100b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
100c0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
100d0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
100e0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
100f0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
10100 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
10110 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
10120 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
10130 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10140 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
10160 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
10170 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
10180 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
10190 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
101a0 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
101b0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
101c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
101d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
101e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
101f0 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
10200 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10210 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
10220 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
10230 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72  gic));.        r
10240 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10250 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
10260 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
10270 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
10280 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
10290 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
102a0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
102b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
102c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
102d0 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
102e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
102f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
10300 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10310 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
10320 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
10330 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
10340 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
10350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
10360 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
10370 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
10380 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
10390 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
103a0 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
103b0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
103c0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
103d0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
103e0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
103f0 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
10400 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
10410 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
10420 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
10430 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
10440 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
10450 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
10460 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
10470 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
10480 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
10490 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
104a0 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
104b0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
104c0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
104d0 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
104e0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
104f0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
10500 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
10510 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
10520 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
10530 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
10540 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
10550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10560 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10570 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
10580 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
10590 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
105a0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
105b0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
105c0 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
105d0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
105e0 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
105f0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
10600 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
10610 65 61 74 65 20 75 6e 74 69 6c 20 74 68 65 20 62  eate until the b
10620 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
10630 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
10640 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
10650 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
10660 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10670 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
10680 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10690 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
106a0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
106b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
106c0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
106d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
106e0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
106f0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10700 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
10710 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10720 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
10730 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
10740 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
10750 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
10760 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
10770 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
10780 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
10790 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
107a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
107b0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 75 73  lse{.    int bus
107c0 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a  y = 1;.    do {.
107d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
107e0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
107f0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
10800 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
10810 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
10820 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10830 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
10840 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10850 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10860 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
10870 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10880 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
10890 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
108a0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
108b0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
108c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
108d0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
108e0 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
108f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10900 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10910 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
10920 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
10930 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
10940 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
10950 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
10960 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
10970 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
10980 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
10990 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
109a0 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
109b0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
109c0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
109d0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
109e0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
109f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
10a00 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
10a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
10a20 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
10a30 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
10a40 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
10a50 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
10a60 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
10a70 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
10a80 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10a90 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
10aa0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
10ab0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
10ac0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
10ad0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
10ae0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
10af0 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
10b00 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
10b10 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
10b20 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
10b30 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
10b40 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
10b50 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
10b60 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
10b70 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
10b80 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
10b90 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
10ba0 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
10bb0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
10bc0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
10bd0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
10be0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
10bf0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
10c00 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
10c10 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
10c20 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
10c30 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
10c40 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
10c50 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
10c60 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
10c70 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
10c80 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
10c90 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
10ca0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
10cb0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
10cc0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
10cd0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
10ce0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
10cf0 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
10d00 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
10d10 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
10d20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
10d30 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
10d40 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
10d50 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
10d60 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
10d70 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
10d80 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
10d90 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
10da0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
10db0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
10dc0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
10dd0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
10de0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10df0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10e00 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
10e10 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
10e20 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
10e30 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
10e40 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
10e50 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
10e60 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
10e70 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
10e80 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10e90 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
10ea0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
10eb0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
10ec0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
10ed0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
10ee0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
10ef0 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
10f00 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
10f10 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
10f20 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
10f30 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
10f40 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
10f50 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
10f60 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
10f70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
10f80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10f90 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
10fa0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
10fb0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
10fc0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
10fd0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
10fe0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
10ff0 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25   TRACE3("STORE %
11000 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
11010 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
11020 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
11030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11040 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
11050 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
11060 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72  A(pList), pPager
11070 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
11080 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
11090 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
110a0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
110b0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 69  no, 0);.    }.#i
110c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
110d0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41   else{.      TRA
110e0 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
110f0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
11100 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
11110 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
11120 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
11130 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11140 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
11150 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20   = 0;.    pList 
11160 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
11170 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
11180 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
11190 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
111a0 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
111b0 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
111c0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
111d0 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
111e0 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
111f0 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
11200 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
11210 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
11220 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
11230 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
11240 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
11250 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
11260 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
11270 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
11280 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
11290 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
112a0 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
112b0 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
112c0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
112d0 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
112e0 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
112f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
11300 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
11310 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
11320 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
11330 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
11340 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
11350 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
11360 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
11370 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
11380 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
11390 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
113a0 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
113b0 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
113c0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
113d0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
113e0 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
113f0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
11400 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
11410 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
11420 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
11430 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
11440 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
11450 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
11460 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
11470 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
11480 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
11490 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
114a0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
114b0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
114c0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
114d0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
114e0 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
114f0 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
11500 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
11510 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
11520 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
11530 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
11540 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
11550 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
11560 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
11570 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
11580 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
11590 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
115a0 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
115b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
115c0 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
115d0 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
115e0 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
115f0 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
11600 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11610 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
11620 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
11630 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
11640 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
11650 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
11660 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
11670 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
11680 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
11690 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
116a0 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
116b0 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
116c0 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
116d0 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
116e0 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
116f0 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
11700 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
11710 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
11720 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
11730 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
11740 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
11750 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
11760 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
11770 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11780 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
11790 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
117a0 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
117b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
117c0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
117d0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
117e0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
117f0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
11800 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
11810 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
11820 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
11830 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
11840 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
11850 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
11860 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
11870 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
11880 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
11890 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
118a0 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
118b0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
118c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
118d0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  e..  */.  if( pP
118e0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
118f0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72   !MEMDB ){.    r
11900 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
11910 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
11920 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
11930 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
11950 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
11960 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
11970 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
11980 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
11990 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
119a0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
119b0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
119c0 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
119d0 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
119e0 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
119f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
11a00 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
11a10 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  & .        sqlit
11a20 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
11a30 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
11a40 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c   &&.        !sql
11a50 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
11a60 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  vedLock(&pPager-
11a70 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  >fd) .    ){.   
11a80 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
11a90 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58      /* Get an EX
11aa0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
11ab0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11ac0 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  e. At this point
11ad0 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a   it is.       **
11ae0 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
11af0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
11b00 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
11b10 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
11b20 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  e.       ** EXCL
11b30 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
11b40 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
11b50 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
11b60 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  en the.       **
11b70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
11b80 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52  detect the RESER
11b90 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f  VED lock, and co
11ba0 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a  nclude that the.
11bb0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
11bc0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
11bd0 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
11be0 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
11bf0 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
11c00 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
11c10 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20    ** .       ** 
11c20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
11c30 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
11c40 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
11c50 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20  quested, the.   
11c60 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
11c70 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
11c80 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
11c90 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
11ca0 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f  l to.       ** o
11cb0 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
11cc0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11cd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11ce0 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  le..       */.  
11cf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11d00 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
11d10 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
11d20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28  OCK);.       if(
11d30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11d40 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  {.         sqlit
11d50 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
11d60 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
11d70 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
11d80 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
11d90 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
11da0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11db0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
11dc0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
11dd0 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
11de0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
11df0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
11e00 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
11e10 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
11e20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
11e30 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
11e40 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
11e50 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
11e60 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
11e70 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
11e80 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
11e90 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
11ea0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
11eb0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
11ec0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
11ed0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
11ee0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
11ef0 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
11f00 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
11f10 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
11f20 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
11f30 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
11f40 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
11f50 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
11f60 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
11f70 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
11f80 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
11f90 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
11fa0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
11fb0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
11fc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
11fe0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
11ff0 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
12000 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
12010 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
12020 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
12030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12040 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a  _BUSY;.       }.
12050 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
12060 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
12070 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
12080 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
12090 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
120a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
120b0 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
120c0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
120d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
120e0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a  ournalHdr = 0;..
120f0 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
12100 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
12110 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
12120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
12130 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f  ite.       ** lo
12140 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
12150 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12160 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
12170 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
12180 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
12190 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
121a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
121b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
121c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
121d0 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73   pPg = 0;.  }els
121e0 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68  e{.    /* Search
121f0 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63   for page in cac
12200 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  he */.    pPg = 
12210 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
12220 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ger, pgno);.    
12230 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61  if( MEMDB && pPa
12240 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
12250 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
12260 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
12270 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
12280 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12290 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
122a0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
122b0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
122c0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
122d0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
122e0 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b  pPager->nMiss++;
122f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
12300 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
12310 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d  xPage || pPager-
12320 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45  >pFirst==0 || ME
12330 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  MDB ){.      /* 
12340 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67  Create a new pag
12350 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d  e */.      pPg =
12360 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
12370 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
12380 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e   pPager->psAlign
12390 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123b0 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
123c0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
123f0 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
12400 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  istory) );.     
12410 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
12420 20 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44         if( !MEMD
12430 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  B ){.          p
12440 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
12450 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12460 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
12470 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
12480 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20  AGER_ERR_MEM;.  
12490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
124a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
124b0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
124c0 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
124d0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
124e0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
124f0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12500 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
12510 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
12520 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
12530 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
12540 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
12550 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
12560 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
12570 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
12580 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
12590 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
125a0 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e++;.    }else{.
125b0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20        /* Find a 
125c0 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e  page to recycle.
125d0 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20    Try to locate 
125e0 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
125f0 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65   not.      ** re
12600 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61  quire us to do a
12610 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65  n fsync() on the
12620 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20   journal..      
12630 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  */.      pPg = p
12640 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
12650 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ced;..      /* I
12660 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66  f we could not f
12670 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20  ind a page that 
12680 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
12690 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20   an fsync().    
126a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72    ** on the jour
126b0 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73  nal file then fs
126c0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
126d0 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61  file.  This is a
126e0 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73  .      ** very s
126f0 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
12700 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
12710 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
12720 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20   sometimes.     
12730 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20   ** it can't be 
12740 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f  helped..      */
12750 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
12760 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
12770 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
12780 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
12790 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
127a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
127b0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
127c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
127d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
127e0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
127f0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  }.        if( pP
12800 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
12810 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
12820 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
12830 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77  ode, write a new
12840 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
12850 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a  into the..  ** j
12860 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
12870 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
12880 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
12890 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a  g a journal..  *
128a0 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73  * header that is
128b0 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65   involved in the
128c0 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67   rollback of pag
128d0 65 73 20 74 68 61 74 20 68 61 76 65 0a 09 20 20  es that have..  
128e0 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
128f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
12900 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
12910 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 09   the header is..
12920 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65    ** trashed whe
12930 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  n the nRec field
12940 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20   is updated)..  
12950 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
12970 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
12980 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12990 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20  >journalOff > 0 
129a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
129b0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
129c0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
129d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
129e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
129f0 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
12a00 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
12a10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12a20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
12a30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12a40 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20    }.        pPg 
12a50 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
12a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12a70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
12a80 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f  f==0 );..      /
12a90 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
12aa0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
12ab0 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64   file if it is d
12ac0 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  irty..      */. 
12ad0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69       if( pPg->di
12ae0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
12af0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
12b00 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
12b10 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
12b20 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
12b30 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
12b40 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20  elist( pPg );.  
12b50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12b70 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
12b80 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
12b90 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
12ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12bb0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
12bc0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
12bd0 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  t( pPg->dirty==0
12be0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
12bf0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
12c00 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
12c10 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
12c20 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20  llback, then.   
12c30 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c     ** set the gl
12c40 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
12c50 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
12c60 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20  isabling the.   
12c70 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e     ** sqlite_don
12c80 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  t_rollback() opt
12c90 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
12ca0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
12cb0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
12cc0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
12cd0 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
12ce0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
12cf0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
12d00 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
12d10 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65  might be reloade
12d20 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d  d at a later tim
12d30 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70 6f  e but at that po
12d40 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d  int we won't rem
12d50 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  ember.      ** t
12d60 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
12d70 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
12d80 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
12d90 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
12da0 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61  t.      ** be ma
12db0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
12dc0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
12dd0 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a   on out..      *
12de0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
12df0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
12e00 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
12e10 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
12e20 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a  k = 1;.      }..
12e30 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20        /* Unlink 
12e40 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
12e50 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
12e60 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
12e70 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  le.      */.    
12e80 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
12e90 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
12ea0 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a  >nOvfl++;.    }.
12eb0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
12ec0 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50  pgno;.    if( pP
12ed0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
12ee0 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
12ef0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
12f00 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
12f10 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
12f20 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
12f30 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
12f40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12f50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12f60 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
12f70 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
12f80 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
12f90 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
12fa0 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
12fb0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
12fc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12fd0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
12fe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
12ff0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
13000 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13010 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20  ger->aInStmt && 
13020 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
13030 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20  r->stmtSize.    
13040 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
13050 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e  ger->aInStmt[pgn
13060 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
13070 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  &7)))!=0 ){.    
13080 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
13090 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
130a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
130b0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
130c0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
130d0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64      }.    pPg->d
130e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
130f0 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
13100 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20   REFINFO(pPg);. 
13110 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
13120 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72  +;.    h = pager
13130 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20  _hash(pgno);.   
13140 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
13150 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
13160 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
13170 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
13180 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
13190 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
131a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
131b0 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
131c0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
131d0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
131e0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
131f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13200 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
13210 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
13220 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
13230 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
13240 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
13250 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
13260 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
13270 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13280 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13290 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
132a0 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
132b0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
132c0 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
132d0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
132e0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
132f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
13310 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29  Size<(int)pgno )
13320 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
13330 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13340 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
13350 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  geSize);.    }el
13360 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
13370 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13380 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20  MEMDB==0 );.    
13390 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
133a0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
133b0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
133c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
133d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
133e0 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
133f0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
13400 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
13410 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
13420 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25   TRACE3("FETCH %
13430 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
13440 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
13450 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
13460 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
13470 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13480 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
13490 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
134a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
134b0 20 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a       i64 fileSiz
134c0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
134d0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
134e0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
134f0 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
13500 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
13510 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
13520 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  gno*pPager->page
13530 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
13540 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
13550 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
13560 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
13570 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13580 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13590 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
135a0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
135b0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
135c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
135d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
135e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
135f0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
13600 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
13610 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
13620 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b   pPager->nHit++;
13630 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
13640 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
13650 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  e = PGHDR_TO_DAT
13660 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  A(pPg);.  return
13670 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13680 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
13690 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
136a0 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
136b0 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
136c0 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
136d0 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
136e0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
136f0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
13700 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
13710 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
13720 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
13730 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  lso sqlite3pager
13740 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  _get().  The dif
13750 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
13760 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
13770 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  and sqlite3pager
13780 5f 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  _get() is that _
13790 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
137a0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
137b0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
137c0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
137d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
137e0 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
137f0 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
13800 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
13810 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
13820 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
13830 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
13840 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
13850 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70  /.void *sqlite3p
13860 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65  ager_lookup(Page
13870 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
13880 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
13890 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
138a0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
138b0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
138c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
138d0 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
138e0 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
138f0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
13900 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
13910 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
13920 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d  no);.  if( pPg==
13930 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
13940 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
13950 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f   return PGHDR_TO
13960 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f  _DATA(pPg);.}../
13970 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70  *.** Release a p
13980 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  age..**.** If th
13990 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
139a0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
139b0 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c  ge drop to zero,
139c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67   then the.** pag
139d0 65 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  e is added to th
139e0 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65  e LRU list.  Whe
139f0 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73  n all references
13a00 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a   to all pages.**
13a10 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61   are released, a
13a20 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13a30 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
13a40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
13a50 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a  .** removed..*/.
13a60 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
13a70 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61  _unref(void *pDa
13a80 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
13a90 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65  g;..  /* Decreme
13aa0 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
13ab0 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20   count for this 
13ac0 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20  page.  */.  pPg 
13ad0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
13ae0 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
13af0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
13b00 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pPg->nRef--;.
13b10 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
13b20 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
13b30 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
13b40 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
13b50 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
13b60 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
13b70 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
13b80 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
13b90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
13ba0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
13bb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
13bc0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
13bd0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
13be0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
13bf0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
13c00 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
13c10 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
13c20 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
13c30 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
13c40 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
13c50 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
13c60 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
13c70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c80 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
13c90 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
13ca0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
13cb0 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
13cc0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
13cd0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
13ce0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
13cf0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
13d00 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
13d10 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
13d20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
13d30 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67  ctor(pData, pPag
13d40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
13d50 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
13d60 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
13d70 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
13d80 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
13d90 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
13da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13db0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
13dc0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
13dd0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13de0 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
13df0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
13e00 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  ef==0 && !MEMDB 
13e10 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72  ){.      pager_r
13e20 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
13e30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
13e40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13e50 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
13e60 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
13e70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
13e80 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
13e90 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
13ea0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
13eb0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
13ec0 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
13ed0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13ee0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
13ef0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
13f00 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
13f10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
13f20 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
13f30 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
13f40 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
13f50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
13f60 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
13f70 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
13f80 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
13f90 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
13fa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13fb0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
13fc0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
13fd0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13fe0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
13ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
14000 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
14010 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
14020 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
14030 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
14040 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
14050 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
14060 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
14070 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
14080 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
14090 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
140a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
140b0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
140c0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63  ournal;.  }.  rc
140d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
140e0 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
140f0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
14100 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d  ger->jfd,pPager-
14110 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50  >tempFile);.  pP
14120 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14130 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14140 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
14150 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14160 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
14170 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14180 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
14190 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
141a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
141b0 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50  OpenDirectory(pP
141c0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
141d0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  , &pPager->jfd);
141e0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
141f0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50  alOpen = 1;.  pP
14200 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
14210 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  rted = 0;.  pPag
14220 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
14230 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61  ;.  pPager->alwa
14240 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
14250 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
14260 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
14270 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
14280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
14290 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
142a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
142b0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
142c0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
142d0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
142e0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
142f0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
14300 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
14310 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
14320 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
14330 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
14340 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
14350 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
14360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14370 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
14380 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
14390 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
143a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
143b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
143c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
143d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69   return rc;..fai
143e0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
143f0 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nal:.  sqliteFre
14400 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
14410 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
14420 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
14430 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
14440 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
14450 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
14460 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
14470 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74 75  R_UNLOCK;.  retu
14480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14490 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
144a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
144b0 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
144c0 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
144d0 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
144e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
144f0 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
14500 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
14510 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
14520 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
14530 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
14540 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
14550 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
14560 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
14570 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
14580 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
14590 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
145a0 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
145b0 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
145c0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
145d0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
145e0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
145f0 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
14600 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
14610 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
14620 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
14630 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
14640 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
14650 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
14660 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
14670 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
14680 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
14690 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
146a0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
146b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
146c0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
146d0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
146e0 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
146f0 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
14700 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
14710 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
14720 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
14730 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
14740 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
14750 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
14760 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
14770 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
14780 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
14790 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
147a0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
147b0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
147c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
147d0 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
147e0 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
147f0 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
14800 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
14810 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
14820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
14830 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
14840 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
14850 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
14860 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
14870 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
14880 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
14890 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
148a0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
148b0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
148c0 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
148d0 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
148e0 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
148f0 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
14900 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
14910 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
14920 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
14930 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
14940 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
14950 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
14960 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
14970 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
14980 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
14990 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
149a0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
149b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
149c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
149d0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
149e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
149f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
14a00 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
14a10 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
14a20 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
14a30 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
14a40 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
14a50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
14a60 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
14a70 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
14a80 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
14a90 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
14aa0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
14ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
14ac0 66 28 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  f( SQLITE_BUSY_R
14ad0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
14ae0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
14af0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
14b00 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
14b10 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
14b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14b40 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
14b50 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
14b60 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
14b70 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
14b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14b90 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
14ba0 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
14bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
14bc0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
14bd0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
14be0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
14bf0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
14c00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14c10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
14c20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14c30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
14c40 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
14c50 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
14c60 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
14c70 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
14c80 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
14c90 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
14ca0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
14cb0 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
14cc0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
14cd0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
14ce0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
14cf0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14d00 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
14d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14d20 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
14d30 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
14d40 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
14d50 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
14d60 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
14d70 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
14d80 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
14d90 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
14da0 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
14db0 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
14dc0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
14dd0 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
14de0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14df0 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
14e00 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
14e10 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
14e20 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
14e30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14e40 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
14e50 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
14e60 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
14e70 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
14e80 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
14e90 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
14ea0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
14eb0 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
14ec0 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
14ed0 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
14ee0 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
14ef0 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
14f00 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
14f10 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
14f20 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
14f30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
14f40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
14f50 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
14f60 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
14f70 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
14f80 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
14f90 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
14fa0 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
14fb0 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
14fc0 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
14fd0 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
14fe0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
14ff0 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
15000 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
15010 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
15020 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65  ) or sqlite3page
15030 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
15040 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
15050 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
15060 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
15070 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
15080 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
15090 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
150a0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
150b0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
150c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
150d0 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
150e0 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
150f0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b  ager->errMask ){
15100 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67   .    return pag
15110 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
15120 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
15130 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
15140 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15150 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
15160 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
15170 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
15180 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
15190 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
151a0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
151b0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
151c0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
151d0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
151e0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
151f0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
15200 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
15210 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
15220 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
15230 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
15240 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
15250 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
15260 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
15270 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
15280 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
15290 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
152a0 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
152b0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
152c0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
152d0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
152e0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
152f0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
15300 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
15310 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
15320 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
15330 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
15340 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
15350 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
15360 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
15370 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15380 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15390 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
153a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
153b0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
153c0 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
153d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
153e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
153f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
15400 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
15410 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
15420 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
15430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
15440 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
15450 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
15460 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
15470 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
15480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
15490 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
154a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
154b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
154c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
154d0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
154e0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
154f0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
15500 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
15510 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
15520 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
15530 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
15540 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
15550 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
15560 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
15570 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
15580 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
15590 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
155a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
155b0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
155c0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
155d0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
155e0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
155f0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
15600 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
15610 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
15620 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
15630 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
15640 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
15650 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
15660 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20      u32 saved;. 
15670 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
15680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
15690 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
156a0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
156b0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
156c0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a         TRACE3("J
156d0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
156e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
156f0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
15700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
15710 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
15720 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
15730 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
15740 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
15750 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
15760 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
15770 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
15780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15790 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
157a0 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
157b0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
157c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
157d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
157e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
157f0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
15800 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
15810 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
15820 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
15830 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
15840 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
15850 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
15860 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
15870 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
15880 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
15890 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
158a0 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
158b0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
158c0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
158d0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
158e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
158f0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  8;.          sto
15900 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
15910 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
15920 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
15930 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
15940 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
15950 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
15960 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zPg);.          
15970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15980 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
15990 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
159a0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
159b0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
159c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
159d0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
159e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
159f0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
15a00 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70           CODEC(p
15a10 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
15a20 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
15a30 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
15a40 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
15a50 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65  , pPager) = save
15a60 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  d;.          if(
15a70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15a80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
15a90 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
15aa0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
15ab0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
15ac0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
15ad0 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
15ae0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15af0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
15b00 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
15b10 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
15b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
15b30 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
15b40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
15b50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
15b60 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
15b70 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
15b80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
15b90 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
15ba0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
15bb0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
15bc0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
15bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
15be0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
15bf0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
15c00 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
15c10 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f             page_
15c20 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
15c30 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
15c40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
15c50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c60 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
15c70 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
15c80 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
15c90 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
15ca0 20 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50        TRACE4("AP
15cb0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
15cc0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
15cf0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
15d00 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
15d10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
15d20 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
15d30 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
15d40 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
15d50 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
15d60 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
15d70 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
15d80 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
15d90 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
15da0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
15db0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
15dc0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
15dd0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
15de0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
15df0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
15e00 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
15e10 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
15e20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
15e30 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
15e40 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
15e50 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
15e60 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
15e70 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
15e80 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
15e90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
15ea0 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
15eb0 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
15ec0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
15ed0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
15ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
15ef0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
15f00 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
15f10 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
15f20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
15f30 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
15f40 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
15f50 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
15f60 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
15f70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
15f80 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  st->pStmt==0 );.
15f90 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
15fa0 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
15fb0 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
15fc0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
15fd0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
15fe0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
15ff0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
16000 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
16010 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
16020 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
16030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16040 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
16050 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
16060 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
16070 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
16080 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16090 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
160a0 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
160b0 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43  , -4);.        C
160c0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
160d0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
160e0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
160f0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
16100 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 28 28 63  pPager->stfd,((c
16110 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70  har*)pData)-4, p
16120 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
16130 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  4);.        TRAC
16140 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
16150 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
16160 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
16170 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
16180 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
16190 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
161a0 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
161b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
161c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
161d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
161e0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
161f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16200 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
16210 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
16220 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
16230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16240 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
16250 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
16260 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
16270 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
16280 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
16290 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
162a0 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
162b0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20  no&7);.      }. 
162c0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
162d0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
162e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
162f0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
16300 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
16310 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
16320 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
16330 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
16340 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
16350 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
16360 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
16370 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
16380 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
16390 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
163a0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
163b0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
163c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
163d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
163e0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
163f0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
16400 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
16410 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
16420 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61  .** to sqlite3pa
16430 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e  ger_write().  In
16440 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
16450 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
16460 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
16470 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
16480 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69  f the page..*/.i
16490 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
164a0 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64  iswriteable(void
164b0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
164c0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
164d0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
164e0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
164f0 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70  ty;.}../*.** Rep
16500 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
16510 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
16520 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
16530 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
16540 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
16550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
16560 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
16570 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
16580 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
16590 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
165a0 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
165b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
165c0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
165d0 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
165e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
165f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
16600 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
16610 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  te(pPage);.    i
16620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16630 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
16640 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70  (pPage, pData, p
16650 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16670 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
16680 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
16690 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
166a0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
166b0 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
166c0 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
166d0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
166e0 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
166f0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
16700 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
16710 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
16720 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
16730 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
16740 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
16750 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
16760 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
16770 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
16780 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
16790 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
167a0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
167b0 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
167c0 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
167d0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
167e0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
167f0 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
16800 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
16810 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
16820 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
16830 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
16840 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
16850 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
16860 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72  ack() below, mor
16870 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68  e than double th
16880 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61  e speed.** of la
16890 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61  rge INSERT opera
168a0 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75  tions and quadru
168b0 70 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66  ple the speed of
168c0 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a   large DELETEs..
168d0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
168e0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
168f0 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79  d, set the alway
16900 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74  sRollback flag t
16910 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65  o true..** Subse
16920 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
16930 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
16940 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  _rollback() for 
16950 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a  the same page.**
16960 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72   will thereafter
16970 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68   be ignored.  Th
16980 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  is is necessary 
16990 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c  to avoid a probl
169a0 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61  em.** where a pa
169b0 67 65 20 77 69 74 68 20 64 61 74 61 20 69 73 20  ge with data is 
169c0 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
169d0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65  elist during one
169e0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72   part of.** a tr
169f0 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72  ansaction then r
16a00 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
16a10 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20  freelist during 
16a20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20  a later part.** 
16a30 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e  of the same tran
16a40 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  saction and reus
16a50 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ed for some othe
16a60 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e  r purpose.  When
16a70 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20   it.** is first 
16a80 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
16a90 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74  elist, this rout
16aa0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
16ab0 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20  When reused,.** 
16ac0 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  the dont_rollbac
16ad0 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
16ae0 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
16af0 75 73 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e  use the page con
16b00 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61  tains.** critica
16b10 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
16b20 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
16b30 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20   it gets rolled 
16b40 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a  back in spite.**
16b50 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c   of the dont_rol
16b60 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
16b70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
16b80 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61  er_dont_write(Pa
16b90 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
16ba0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
16bb0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45   *pPg;..  if( ME
16bc0 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  MDB ) return;.. 
16bd0 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
16be0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
16bf0 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73  );.  pPg->always
16c00 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
16c10 69 66 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e  if( pPg && pPg->
16c20 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28  dirty ){.    if(
16c30 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
16c40 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
16c50 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
16c60 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
16c70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
16c80 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
16c90 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
16ca0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
16cb0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
16cc0 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
16cd0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
16ce0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
16cf0 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
16d00 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
16d10 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
16d20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
16d30 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
16d40 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
16d50 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
16d60 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
16d70 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
16d80 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
16d90 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
16da0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
16db0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
16dc0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
16dd0 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
16de0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
16df0 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
16e00 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
16e10 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
16e20 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
16e30 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
16e40 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
16e50 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
16e60 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
16e70 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
16e80 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
16e90 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
16ea0 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
16eb0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
16ec0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
16ed0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
16ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
16ef0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
16f00 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
16f10 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
16f20 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
16f30 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
16f40 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
16f50 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
16f60 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
16f70 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
16f80 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
16f90 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
16fa0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
16fb0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
16fc0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69   journal..*/.voi
16fd0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  d sqlite3pager_d
16fe0 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69  ont_rollback(voi
16ff0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
17000 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
17010 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
17020 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
17030 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
17040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17050 61 74 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate!=PAGER_EXCLU
17060 53 49 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e  SIVE || pPager->
17070 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
17080 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
17090 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
170a0 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
170b0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
170c0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
170d0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
170e0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
170f0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
17100 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
17110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17120 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
17130 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
17140 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
17150 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
17160 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
17170 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17180 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  l = 1;.    if( p
17190 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
171a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
171b0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
171c0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
171d0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
171e0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
171f0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
17200 20 20 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22    }.    TRACE3("
17210 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
17220 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
17230 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
17240 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d  ID(pPager));.  }
17250 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
17260 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
17270 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
17280 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
17290 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
172a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
172b0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
172c0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
172d0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
172e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
172f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
17300 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
17310 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
17320 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
17330 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
17340 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
17350 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d  list(pPg);.  }.}
17360 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  .../*.** Clear a
17370 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
17380 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17390 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
173a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
173b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
173c0 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
173d0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
173e0 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d  pStmt);.  pHist-
173f0 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48  >pOrig = 0;.  pH
17400 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
17410 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
17420 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
17430 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
17440 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
17450 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
17460 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
17470 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
17480 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
17490 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
174a0 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
174b0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
174c0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
174d0 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
174e0 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
174f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
17500 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
17510 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17520 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
17530 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
17540 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
17550 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
17560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
17570 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
17580 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
17590 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
175a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
175b0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
175c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
175d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
175e0 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
175f0 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
17600 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
17610 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17620 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
17630 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
17640 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17650 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
17660 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  .  TRACE2("COMMI
17670 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
17680 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
17690 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
176a0 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
176b0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
176c0 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
176d0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
176e0 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
176f0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17700 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
17710 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
17720 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
17730 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
17740 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
17750 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
17760 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
17770 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
17780 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
17790 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ty;.    }.#ifnde
177a0 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
177b0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
177c0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
177d0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
177e0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
177f0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
17800 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
17810 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17820 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
17830 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
17840 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
17850 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
17860 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
17870 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
17880 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
17890 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
178a0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
178b0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
178c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
178d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
178e0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
178f0 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
17900 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
17910 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
17920 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f  nsuming sqlite3O
17930 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
17940 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
17950 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
17960 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
17970 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
17980 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17990 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
179a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
179b0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
179c0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
179d0 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
179e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
179f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17a00 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
17a10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
17a20 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
17a30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
17a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17a50 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
17a60 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
17a70 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
17a80 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
17a90 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17aa0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
17ab0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
17ac0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
17ad0 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
17ae0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
17af0 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
17b00 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70  bort:.  sqlite3p
17b10 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
17b20 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
17b30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
17b40 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
17b50 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
17b60 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
17b70 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
17b80 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
17b90 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
17ba0 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
17bb0 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
17bc0 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
17bd0 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
17be0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17bf0 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
17c00 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
17c10 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
17c20 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
17c30 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
17c40 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
17c50 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
17c60 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
17c70 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
17c80 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
17c90 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
17ca0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
17cb0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
17cc0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
17cd0 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
17ce0 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
17cf0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
17d00 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
17d10 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
17d20 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
17d30 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
17d40 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17d50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
17d60 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
17d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
17d80 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
17d90 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
17da0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17db0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
17dc0 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
17dd0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
17de0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
17df0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
17e00 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
17e10 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
17e20 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
17e30 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
17e40 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
17e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17e60 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
17e70 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
17e80 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
17e90 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17ea0 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
17eb0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
17ec0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
17ed0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
17ee0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
17ef0 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
17f00 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
17f10 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
17f20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
17f30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
17f40 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
17f50 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
17f60 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
17f70 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
17f80 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
17f90 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
17fa0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
17fb0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
17fc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17fd0 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
17fe0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
17ff0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
18000 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
18020 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
18030 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
18040 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
18050 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
18060 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
18070 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
18080 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
18090 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
180a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
180b0 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
180c0 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
180d0 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
180e0 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
180f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
18100 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
18110 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
18120 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
18130 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
18140 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
18150 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
18160 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
18170 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
18180 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
18190 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
181a0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
181b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
181c0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
181d0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
181e0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
181f0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
18200 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
18210 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
18220 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18230 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
18240 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
18250 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
18260 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
18270 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
18280 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
18290 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
182a0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
182b0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
182c0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
182d0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
182e0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
182f0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
18300 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
18310 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
18320 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 2c 20 72  {.    int rc2, r
18330 63 33 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c3;.    rc = pag
18340 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
18350 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
18360 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
18370 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
18380 2d 3e 6f 72 69 67 44 62 53 69 7a 65 29 3b 0a 20  ->origDbSize);. 
18390 20 20 20 72 63 33 20 3d 20 70 61 67 65 72 5f 75     rc3 = pager_u
183a0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
183b0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
183c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
183d0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
183e0 20 20 20 69 66 28 20 72 63 33 20 29 20 72 63 20     if( rc3 ) rc 
183f0 3d 20 72 63 33 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc3;.    }.  }
18400 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
18410 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
18420 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
18430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18440 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18450 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62  E_CORRUPT;  /* b
18460 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20  kpt-CORRUPT */. 
18470 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
18480 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
18490 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20 70  CORRUPT;.  }.  p
184a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
184b0 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
184c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
184d0 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
184e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
184f0 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
18500 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
18510 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
18520 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
18530 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
18540 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73   sqlite3pager_is
18550 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
18560 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
18570 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
18580 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ly;.}../*.** Thi
18590 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
185a0 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
185b0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
185c0 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33  .*/.int *sqlite3
185d0 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67 65  pager_stats(Page
185e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
185f0 61 74 69 63 20 69 6e 74 20 61 5b 39 5d 3b 0a 20  atic int a[9];. 
18600 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[0] = pPager->
18610 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70  nRef;.  a[1] = p
18620 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20  Pager->nPage;.  
18630 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d  a[2] = pPager->m
18640 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20  xPage;.  a[3] = 
18650 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
18660 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d    a[4] = pPager-
18670 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d  >state;.  a[5] =
18680 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
18690 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65  ;.  a[6] = pPage
186a0 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20  r->nHit;.  a[7] 
186b0 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b  = pPager->nMiss;
186c0 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72  .  a[8] = pPager
186d0 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 72 65 74 75 72  ->nOvfl;.  retur
186e0 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n a;.}../*.** Se
186f0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
18700 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
18710 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18720 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
18730 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
18740 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
18750 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
18760 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
18770 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
18780 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
18790 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
187a0 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
187b0 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
187c0 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
187d0 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
187e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
187f0 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69  3pager_stmt_begi
18800 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  n(Pager *pPager)
18810 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
18820 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f  ar zTemp[SQLITE_
18830 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
18840 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
18850 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
18860 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18870 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20  ->dbSize>=0 );. 
18880 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45   TRACE2("STMT-BE
18890 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  GIN %d\n", PAGER
188a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
188b0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
188c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
188d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
188e0 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50  r->stmtSize = pP
188f0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
18900 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18910 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  OK;.  }.  if( !p
18920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18930 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  en ){.    pPager
18940 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
18950 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
18960 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18970 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18980 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
18990 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
189a0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
189b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
189c0 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
189d0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d  Pager->aInStmt==
189e0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
189f0 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
18a00 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
18a10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18a20 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
18a30 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
18a40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
18a50 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
18a60 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
18a70 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
18a80 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
18a90 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
18aa0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18ab0 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
18ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
18ad0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
18ae0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
18af0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18b00 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
18b10 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
18b20 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
18b30 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
18b40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
18b50 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
18b60 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
18b70 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
18b80 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
18b90 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
18ba0 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61  temp(zTemp, &pPa
18bb0 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
18bc0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
18bd0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
18be0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
18bf0 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70  tOpen = 1;.    p
18c00 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
18c10 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
18c20 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
18c30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18c40 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67  E_OK;. .stmt_beg
18c50 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  in_failed:.  if(
18c60 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18c70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
18c80 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  ee(pPager->aInSt
18c90 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  mt);.    pPager-
18ca0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
18cb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18cc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
18cd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
18ce0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18cf0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65  stmt_commit(Page
18d00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
18d10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
18d20 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
18d30 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
18d40 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d     TRACE2("STMT-
18d50 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
18d60 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18d70 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
18d80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
18d90 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73  sSeek(&pPager->s
18da0 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f  tfd, 0);.      /
18db0 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  * sqlite3OsTrunc
18dc0 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ate(&pPager->stf
18dd0 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
18de0 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
18df0 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20  er->aInStmt );. 
18e00 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
18e10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
18e20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
18e30 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
18e40 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
18e50 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
18e60 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
18e70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53  assert( pPg->inS
18e80 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67  tmt );.      pPg
18e90 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
18ea0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
18eb0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
18ec0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
18ed0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
18ee0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
18ef0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
18f00 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
18f10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18f20 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
18f30 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
18f40 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
18f50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
18f60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
18f70 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
18f80 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
18f90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
18fa0 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
18fb0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
18fc0 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
18fd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18fe0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
18ff0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
19000 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
19010 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  stmt_rollback(Pa
19020 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19030 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50  int rc;.  if( pP
19040 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
19050 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  ){.    TRACE2("S
19060 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  TMT-ROLLBACK %d\
19070 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19080 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  er));.    if( ME
19090 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48  MDB ){.      PgH
190a0 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66  dr *pPg;.      f
190b0 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
190c0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
190d0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a  Pg->pNextStmt){.
190e0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
190f0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
19100 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
19110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
19120 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
19130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
19140 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
19150 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
19160 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
19170 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
19180 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
19190 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
191a0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
191b0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
191c0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
191d0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
191e0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
191f0 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79  ze;.      memory
19200 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
19210 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
19220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
19230 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
19240 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
19250 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
19260 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
19270 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50  r_stmt_commit(pP
19280 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
19290 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
192a0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
192b0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
192c0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
192d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
192e0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
192f0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
19300 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
19310 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70  t char *sqlite3p
19320 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61  ager_filename(Pa
19330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19340 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
19350 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
19360 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
19370 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
19380 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
19390 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
193a0 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d  ite3pager_dirnam
193b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
193c0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
193d0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d  r->zDirectory;.}
193e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
193f0 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
19400 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
19410 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
19420 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
19430 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  r_journalname(Pa
19440 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19450 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
19460 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
19470 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
19480 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
19490 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
194a0 67 65 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20  ger_set_codec(. 
194b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
194c0 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29    void (*xCodec)
194d0 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
194e0 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  o,int),.  void *
194f0 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70  pCodecArg.){.  p
19500 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20  Pager->xCodec = 
19510 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72  xCodec;.  pPager
19520 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43  ->pCodecArg = pC
19530 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a  odecArg;.}../*.*
19540 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
19550 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72  s called to incr
19560 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61  ement the databa
19570 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63  se file change-c
19580 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65  ounter,.** store
19590 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20  d at byte 24 of 
195a0 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a  the pager file..
195b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
195c0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
195d0 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50  ounter(Pager *pP
195e0 61 67 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70  ager){.  void *p
195f0 50 61 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70  Page;.  PgHdr *p
19600 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
19610 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
19620 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65  nt rc;..  /* Ope
19630 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
19640 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
19650 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  . */.  rc = sqli
19660 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
19670 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b  ger, 1, &pPage);
19680 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19690 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
196a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
196b0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
196c0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
196d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
196e0 20 72 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   rc;..  /* Read 
196f0 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
19700 65 20 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f  e at byte 24. */
19710 0a 20 20 70 50 67 48 64 72 20 3d 20 44 41 54 41  .  pPgHdr = DATA
19720 5f 54 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29  _TO_PGHDR(pPage)
19730 3b 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  ;.  change_count
19740 65 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62  er = retrieve32b
19750 69 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b  its(pPgHdr, 24);
19760 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
19770 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
19780 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
19790 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
197a0 34 2e 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63  4. */.  change_c
197b0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72  ounter++;.  stor
197c0 65 33 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63  e32bits(change_c
197d0 6f 75 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20  ounter, pPgHdr, 
197e0 32 34 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  24);..  /* Relea
197f0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
19800 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  rence. */.  sqli
19810 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
19820 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
19830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19840 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
19850 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
19860 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
19870 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
19880 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
19890 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
198a0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
198b0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
198c0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
198d0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
198e0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
198f0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
19900 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
19910 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
19920 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
19930 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
19940 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
19950 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
19960 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
19970 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
19980 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
19990 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
199a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
199b0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
199c0 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
199d0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
199e0 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
199f0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
19a00 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
19a10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
19a20 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
19a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
19a40 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
19a50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
19a60 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
19a70 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
19a80 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
19a90 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
19aa0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70  d to an sqlite3p
19ab0 61 67 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c  ager_sync() call
19ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
19ad0 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
19ae0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
19af0 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
19b00 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
19b10 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
19b20 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
19b30 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
19b40 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ses)..*/.int sql
19b50 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50  ite3pager_sync(P
19b60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
19b70 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
19b80 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
19b90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19ba0 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34  TE_OK;..  TRACE4
19bb0 28 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a  ("DATABASE SYNC:
19bc0 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72   File=%s zMaster
19bd0 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22  =%s nTrunc=%d\n"
19be0 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  , .      pPager-
19bf0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73  >zFilename, zMas
19c00 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20  ter, nTrunc);.. 
19c10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
19c20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
19c30 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
19c40 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
19c50 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
19c60 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
19c70 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
19c80 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
19c90 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
19ca0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
19cb0 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
19cc0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
19cd0 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
19ce0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73  Hdr *pPg;.    as
19cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
19d00 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20  urnalOpen );..  
19d10 20 20 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72    /* If a master
19d20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
19d30 6d 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  me has already b
19d40 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
19d50 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  he.    ** journa
19d60 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  l file, then no 
19d70 73 79 6e 63 20 69 73 20 72 65 71 75 69 72 65 64  sync is required
19d80 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77  . This happens w
19d90 68 65 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a  hen it is.    **
19da0 20 77 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74   written, then t
19db0 68 65 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73  he process fails
19dc0 20 74 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d   to upgrade from
19dd0 20 61 20 52 45 53 45 52 56 45 44 20 74 6f 20 61   a RESERVED to a
19de0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
19df0 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78  VE lock. The nex
19e00 74 20 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65  t time the proce
19e10 73 73 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d  ss tries to comm
19e20 69 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  it the.    ** tr
19e30 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d  ansaction the m-
19e40 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65  j name will have
19e50 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
19e60 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  itten..    */.  
19e70 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
19e80 65 74 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  etMaster ){.    
19e90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
19ea0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
19eb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
19ec0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19ed0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
19ee0 74 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  t;.#ifndef SQLIT
19ef0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
19f00 4d 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 75  M.      if( nTru
19f10 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  nc!=0 ){.       
19f20 20 2f 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e   /* If this tran
19f30 73 61 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65  saction has made
19f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6d   the database sm
19f50 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20  aller, then all 
19f60 70 61 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  pages.        **
19f70 20 62 65 69 6e 67 20 64 69 73 63 61 72 64 65 64   being discarded
19f80 20 62 79 20 74 68 65 20 74 72 75 6e 63 61 74 69   by the truncati
19f90 6f 6e 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  on must be writt
19fa0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
19fb0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c  l.        ** fil
19fc0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
19fd0 20 20 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20        Pgno i;.  
19fe0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67        void *pPag
19ff0 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e;.        for( 
1a000 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70  i=nTrunc+1; i<=p
1a010 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a020 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20  e; i++ ){.      
1a030 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72      if( !(pPager
1a040 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38  ->aInJournal[i/8
1a050 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20  ] & (1<<(i&7))) 
1a060 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1a070 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1a080 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1a090 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1a0a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a0b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1a0c0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1a0d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1a0e0 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1a0f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1a100 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1a110 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1a120 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1a130 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a140 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1a150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a160 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1a170 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1a180 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1a190 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1a1a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a1b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a1c0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1a1d0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1a1e0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1a1f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a200 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a210 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1a220 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a230 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1a240 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1a250 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a260 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1a270 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1a280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a290 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a2a0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1a2b0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1a2c0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1a2d0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1a2e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1a2f0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1a300 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1a310 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1a320 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1a330 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1a340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1a350 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1a360 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1a370 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1a380 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1a390 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1a3a0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1a3b0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1a3c0 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
1a3d0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d    }..    pPager-
1a3e0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
1a3f0 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63  YNCED;.  }..sync
1a400 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
1a410 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1a420 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a430 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ACUUM../*.** Mov
1a440 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  e the page ident
1a450 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74  ified by pData t
1a460 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
1a470 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a  in the file. .**
1a480 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
1a490 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
1a4a0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
1a4b0 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72  age pgno. If cur
1a4c0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e  rent page.** pgn
1a4d0 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
1a4e0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
1a4f0 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
1a500 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72  not written ther
1a510 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20  e by.** by this 
1a520 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d  routine. The sam
1a530 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  e applies to the
1a540 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65   page pData refe
1a550 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74  rs to on entry t
1a560 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
1a570 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
1a580 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
1a590 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44  refered to by pD
1a5a0 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  ata remain valid
1a5b0 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
1a5c0 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
1a5d0 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
1a5e0 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74   pData (i.e. dat
1a5f0 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
1a600 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
1a610 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
1a620 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
1a630 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1a640 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1a650 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
1a660 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1a670 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
1a680 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a690 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 69  ed, however it i
1a6a0 73 20 0a 2a 2a 20 69 6c 6c 65 67 61 6c 20 74 6f  s .** illegal to
1a6b0 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
1a6c0 6e 65 20 69 66 20 61 20 73 74 61 74 6d 65 6e 74  ne if a statment
1a6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1a6e0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1a6f0 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1a700 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1a710 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1a720 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1a730 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1a740 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1a750 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1a760 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 0a 20 20  d; .  int h;..  
1a770 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1a780 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
1a790 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1a7a0 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 34  f>0 );..  TRACE4
1a7b0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1a7c0 64 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  d moves to %d\n"
1a7d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a7e0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  ), pPg->pgno, pg
1a7f0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  no);..  /* Unlin
1a800 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
1a810 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
1a820 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
1a830 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
1a840 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
1a850 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
1a860 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
1a870 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
1a880 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73  t.  ** from it's
1a890 20 68 61 73 68 20 63 68 61 69 6e 2e 0a 20 20 2a   hash chain..  *
1a8a0 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  /.  pPgOld = pag
1a8b0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1a8c0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1a8d0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
1a8e0 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
1a8f0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    unli
1a900 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
1a910 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
1a920 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d   pPgOld->dirty =
1a930 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f   0;.    if( pPgO
1a940 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ld->needSync ){.
1a950 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1a960 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ync = 1;.    }. 
1a970 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
1a980 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1a990 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
1a9a0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
1a9b0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
1a9c0 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  /.  pPg->pgno = 
1a9d0 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65  pgno;.  h = page
1a9e0 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20  r_hash(pgno);.  
1a9f0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
1aa00 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
1aa10 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
1aa20 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
1aa30 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1aa40 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
1aa50 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
1aa60 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
1aa70 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
1aa80 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
1aa90 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
1aaa0 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
1aab0 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64 69   = 0;..  pPg->di
1aac0 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  rty = 1;.  pPage
1aad0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1aae0 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1;..  return SQL
1aaf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1ab00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1ab10 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1ab20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
1ab30 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
1ab40 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
1ab50 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  te of the file l
1ab60 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ock for the give
1ab70 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  n pager..** The 
1ab80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1ab90 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20  one of NO_LOCK, 
1aba0 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
1abb0 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50  ERVED_LOCK,.** P
1abc0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20  ENDING_LOCK, or 
1abd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
1abe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1abf0 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61  ger_lockstate(Pa
1ac00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69  ger *pPager){.#i
1ac10 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72  fdef OS_TEST.  r
1ac20 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64  eturn pPager->fd
1ac30 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23  ->fd.locktype;.#
1ac40 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50  else.  return pP
1ac50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ager->fd.locktyp
1ac60 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64  e;.#endif.}.#end
1ac70 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
1ac80 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69  E_TEST./*.** Pri
1ac90 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  nt a listing of 
1aca0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70  all referenced p
1acb0 61 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72  ages and their r
1acc0 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69  ef count..*/.voi
1acd0 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
1ace0 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50  efdump(Pager *pP
1acf0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
1ad00 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  pPg;.  for(pPg=p
1ad10 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
1ad20 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1ad30 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50  All){.    if( pP
1ad40 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e  g->nRef<=0 ) con
1ad50 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74  tinue;.    sqlit
1ad60 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50  e3DebugPrintf("P
1ad70 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20  AGE %3d addr=%p 
1ad80 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  nRef=%d\n", .   
1ad90 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50      pPg->pgno, P
1ada0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1adb0 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20  ), pPg->nRef);. 
1adc0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a               }.}.#endif.