/ Hex Artifact Content
Login

Artifact e4fec09c20201eaeca5f6a8fb2d6cdd415d97561:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 35  : pager.c,v 1.35
0350: 33 20 32 30 30 37 2f 30 38 2f 31 30 20 32 33 3a  3 2007/08/10 23:
0360: 35 34 3a 31 36 20 64 72 68 20 45 78 70 20 24 0a  54:16 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
19b0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
19c0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
19d0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
19e0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
19f0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1a00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1a10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1a20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1a30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1a40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1a50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1a60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1a70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1a80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1a90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1aa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ab0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1ac0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1ad0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1ae0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1af0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
1b00: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
1b10: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
1b20: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
1b30: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
1b40: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
1b50: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
1b60: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
1b70: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
1b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b90: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
1ba0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
1bb0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
1bc0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
1bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1be0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
1bf0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
1c00: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c10: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
1c20: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
1c30: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
1c40: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
1c50: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
1c60: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
1c70: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
1c80: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1c90: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1ca0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
1cb0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
1cc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
1cd0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ce0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1cf0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
1d00: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
1d10: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
1d20: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
1d30: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
1d40: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
1d50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d60: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
1d70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
1d80: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
1d90: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
1da0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
1db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1dc0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
1dd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1de0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1df0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e00: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
1e10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
1e20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1e30: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
1e40: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1e50: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
1e60: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
1e70: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
1e80: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
1e90: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
1ea0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
1eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
1ed0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ee0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
1ef0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
1f00: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
1f10: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1f20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1f30: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
1f40: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
1f50: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
1f60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1f70: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
1f80: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
1fa0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
1fb0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
1fc0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1fd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
1fe0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
1ff0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2000: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2010: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2020: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2030: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2040: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2050: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2060: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2070: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2080: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2090: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
20a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
20b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
20c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
20d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
20e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
20f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2100: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2110: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2120: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2130: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2140: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2150: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2160: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2170: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2180: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2190: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
21a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
21b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
21c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
21d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
21f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2200: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2210: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2220: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2230: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2240: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2250: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2260: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2270: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2280: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2290: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
22a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
22b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
22c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
22d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
22e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
22f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2300: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2310: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2320: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2330: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2340: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2350: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2360: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2370: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2380: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2390: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
23a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
23b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
23c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
23d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
23e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
23f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2400: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2410: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2420: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2430: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2440: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2450: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2460: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2470: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2480: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2490: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
24a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
24b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
24c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
24d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
24e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
24f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2500: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2510: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2520: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2530: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2540: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2550: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2560: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2570: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2580: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2590: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
25a0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
25b0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
25c0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
25d0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
25e0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
25f0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2600: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2610: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2620: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2630: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2640: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2650: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2660: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2670: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2680: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2690: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
26a0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
26b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
26c0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
26d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
26e0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
26f0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2700: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2710: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2720: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2730: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2740: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2750: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2760: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2770: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2780: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2790: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
27a0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
27b0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
27c0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
27d0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
27e0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
27f0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2800: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2810: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
2820: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
2830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
2860: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
2870: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
2880: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
28c0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
28d0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
28e0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
28f0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
2900: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
2910: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
2920: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
2930: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
2940: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
2950: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
2960: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
2970: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
2980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2990: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
29c0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
29d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
29e0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
29f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
2a00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
2a10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
2a20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
2a30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2a40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
2a50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
2a60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
2a70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2a80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2a90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
2aa0: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
2ab0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
2ac0: 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20   u8 needRead;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  /* Read content 
2af0: 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29 20  if PagerWrite() 
2b00: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73  is called */.  s
2b10: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
2b40: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
2b50: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
2b60: 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20  , *pPrevDirty;  
2b70: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
2b80: 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65   */.  u32 notUse
2b90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ba0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73       /* Buffer s
2bb0: 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  pace */.#ifdef S
2bc0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2bd0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
2be0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2bf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
2c00: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
2c10: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
2c20: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
2c30: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
2c40: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
2c50: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
2c60: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
2c70: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
2c80: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
2c90: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
2ca0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
2cb0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
2cc0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
2cd0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
2ce0: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
2cf0: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
2d00: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
2d10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d20: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
2d30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
2d40: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
2d50: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
2d60: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
2d70: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
2d90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
2da0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2db0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2dc0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
2dd0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
2de0: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
2df0: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
2e00: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
2e10: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
2e20: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
2e30: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
2e40: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
2e50: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
2e60: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
2e70: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
2e80: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
2e90: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
2ea0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2eb0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
2ec0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
2ed0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2ee0: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2ef0: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2f00: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2f10: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2f20: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2f30: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2f40: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2f50: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f60: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2f70: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
2f80: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
2f90: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
2fa0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2fb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2fc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
2ff0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3000: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3010: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3020: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3030: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3040: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
3060: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
3070: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3080: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
3090: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
30a0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
30b0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
30c0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
30d0: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
30e0: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
30f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3100: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3110: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3120: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3130: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3140: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3150: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
3160: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
3170: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
3180: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
3190: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
31a0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
31b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
31c0: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
31d0: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
31e0: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
31f0: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
3200: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
3210: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3220: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
3230: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
3240: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
3250: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
3260: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
3270: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
3280: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
3290: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
32a0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
32b0: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
32c0: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
32d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
32e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
32f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3300: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
3310: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
3320: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
3330: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
3340: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
3350: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
3360: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
3370: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
3380: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
3390: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
33a0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
33b0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
33c0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
33d0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
33e0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
33f0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
3400: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
3410: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
3420: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
3430: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
3440: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
3450: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
3460: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
3470: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
3480: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
3490: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
34a0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
34b0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
34c0: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
34d0: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
34e0: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
34f0: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
3500: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3510: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3530: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3540: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3550: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3560: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3570: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3580: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3590: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
35b0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
35c0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
35d0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
35e0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
35f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3600: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3610: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3620: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3640: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3660: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3670: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3690: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
36a0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
36b0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
36c0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
36d0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
36e0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
36f0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3700: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3710: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3720: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3730: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3740: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3750: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3770: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3780: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3790: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
37a0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
37c0: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
37d0: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
37e0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3800: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3810: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3820: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3830: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3850: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3860: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3870: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3890: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
38a0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
38b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38d0: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
38e0: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
38f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3900: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3920: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
3930: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
3940: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
3950: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
3960: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
3970: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
3980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3990: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
39b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
39c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
39d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3a00: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3a10: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3a20: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a40: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3a50: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3a60: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3a70: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
3a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a90: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
3aa0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
3ab0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
3ac0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3ad0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3ae0: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3af0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3b00: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
3b10: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
3b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
3b50: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
3b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
3b80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
3b90: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
3bb0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
3bc0: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
3bd0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
3be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bf0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
3c00: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
3c10: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3c20: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
3c50: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
3c60: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3c70: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
3c90: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
3ca0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
3cb0: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
3cc0: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
3cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ce0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
3cf0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
3d00: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
3d10: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3d20: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3d30: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
3d40: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
3d60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d80: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
3d90: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3dc0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3dd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3e10: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
3e20: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
3e30: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
3e40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
3e50: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
3e60: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
3e70: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
3ea0: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
3eb0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3ec0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
3ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3ee0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
3ef0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
3f00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
3f10: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
3f30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
3f40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
3f50: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
3f60: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3f70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3f80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3f90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
3fa0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3fb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3fd0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3fe0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3ff0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
4000: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
4010: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
4020: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
4030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
4040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4050: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
4060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
4070: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
40a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
40b0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
40c0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
40d0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
40e0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
40f0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
4100: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
4110: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
4120: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
4130: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
4140: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
4150: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
4160: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
4170: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
4180: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
41b0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
41c0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
41d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
41e0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
41f0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
4200: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
4210: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
4220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4230: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4260: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4270: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4280: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4290: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
42a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
42b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
42c0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
42d0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
42e0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
42f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
4300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
4310: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
4320: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
4330: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4340: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4350: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4360: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4370: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4390: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
43a0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
43c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
43d0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
43e0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
43f0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
4400: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4410: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4430: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4440: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4450: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4460: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4470: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4480: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4490: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
44a0: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
44b0: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
44c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
44d0: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
44e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
44f0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4500: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4510: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4520: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4540: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4550: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4560: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4570: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4580: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4590: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
45a0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
45b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
45c0: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
45d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
45e0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4600: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4610: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4620: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4640: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4650: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4660: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4680: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4690: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
46b0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
46c0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
46d0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
46e0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4700: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4710: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4720: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4730: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4740: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4750: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4760: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4770: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4790: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
47a0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
47b0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
47c0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
47d0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
47e0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
47f0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4800: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4810: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4820: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4840: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4850: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4860: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4870: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4880: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4890: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48a0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
48b0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
48c0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
48d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
48e0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48f0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4900: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4910: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4920: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4930: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4940: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4950: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4960: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4970: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
49a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
49b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
49c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
49d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
49e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
49f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
4a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
4a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
4a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
4a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
4a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
4a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
4a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
4a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
4a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
4a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
4aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
4ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
4ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
4ad0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
4ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
4af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
4b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
4b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
4b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
4b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
4b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
4b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
4b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
4b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
4b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
4b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
4ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
4bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
4bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
4bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
4be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
4bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
4c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
4c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
4c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
4c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
4c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
4c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
4c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
4c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
4c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
4ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
4cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
4cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
4cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
4ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
4cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
4d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
4d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
4d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
4d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
4d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
4d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
4d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
4d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
4d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
4d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
4da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
4db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
4dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
4dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
4de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
4df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
4e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
4e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
4e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
4e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
4e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
4e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
4e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
4e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
4e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
4e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
4ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
4eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
4ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
4ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
4ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
4f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
4f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
4f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
4f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
4f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4f50: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
4f60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4f70: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
4f80: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
4f90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
4fa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4fb0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4fc0: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4fd0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4fe0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4ff0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5000: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
5010: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
5020: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
5030: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
5040: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
5050: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
5060: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5070: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5080: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5090: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
50a0: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
50b0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
50c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
50d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
50e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
50f0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5100: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
5110: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
5120: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
5130: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
5140: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
5150: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
5160: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5170: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5180: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5190: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
51a0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
51b0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
51c0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
51d0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
51e0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5200: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
5210: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
5220: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
5230: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
5240: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
5250: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
5260: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5270: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5280: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5290: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
52a0: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
52b0: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
52c0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
52d0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
52e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
52f0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5300: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5320: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5330: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5340: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5350: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5360: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5370: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5380: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5390: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
53a0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
53b0: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
53c0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
53d0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
53e0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
53f0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5400: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5410: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5420: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5430: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5440: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5450: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5460: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5470: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5480: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5490: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
54a0: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
54b0: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
54c0: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
54e0: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
54f0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
5500: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5510: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
5520: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
5530: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
5540: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
5550: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
5560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
5570: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
5580: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
5590: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
55a0: 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-3d total=%d\n
55b0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
55c0: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
55d0: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d  (p), p->nRef, p-
55e0: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20  >pPager->nRef.  
55f0: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
5600: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
5610: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
5620: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
5630: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
5640: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
5650: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
5660: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
5670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5680: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
5690: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
56a0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
56b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
56c0: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
56d0: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
56e0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
56f0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
5700: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
5710: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
5730: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
5740: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5750: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5760: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
5770: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74  MEMDB ){.    ret
5780: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  urn PGHDR_TO_HIS
5790: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e  T(pPg, pPager)->
57a0: 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  inStmt;.  }else{
57b0: 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
57c0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
57d0: 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e  u8 *a = pPager->
57e0: 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74  aInStmt;.    ret
57f0: 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70  urn (a && (int)p
5800: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
5810: 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f  tSize && (a[pgno
5820: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
5830: 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7))));.  }.}../*
5840: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
5850: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
5860: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
5870: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
5880: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
5890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
58a0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
58b0: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
58c0: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
58d0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
58e0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
58f0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
5900: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
5910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5920: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
5930: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
5940: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5950: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5960: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5970: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5980: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5990: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
59a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
59b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
59c0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
59d0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
59e0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
59f0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
5a00: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
5a10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
5a20: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
5a30: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
5a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5a50: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
5a60: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
5a70: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
5a80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5a90: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
5aa0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
5ab0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
5ac0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
5ad0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
5ae0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
5af0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
5b00: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
5b10: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
5b20: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
5b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
5b40: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
5b50: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
5b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
5b70: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
5b80: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
5b90: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
5ba0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5bb0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
5bc0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
5bd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5be0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5bf0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
5c00: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
5c10: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
5c20: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
5c30: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
5c40: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
5c50: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
5c60: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
5c70: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5c80: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
5c90: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
5ca0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5cb0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5cc0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5cd0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5ce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5cf0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5d00: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5d10: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5d20: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5d30: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5d40: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5d50: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5d60: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5d70: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5d80: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5d90: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5da0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5db0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5dc0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5dd0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5de0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5e00: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5e10: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5e20: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5e30: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5e40: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5e50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5e60: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5e70: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5e80: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
5e90: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
5ea0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
5eb0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
5ec0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
5ed0: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
5ee0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
5ef0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
5f00: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
5f10: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
5f20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
5f30: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
5f40: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
5f50: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
5f60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
5f70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
5f80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
5f90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
5fa0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
5fb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
5fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
5fd0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
5fe0: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
5ff0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c  s persistent. Al
6000: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  l subsequent API
6010: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
6020: 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d  ager.** will imm
6030: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
6040: 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
6050: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
6060: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
6070: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6080: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
6090: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
60a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
60b0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
60c0: 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  FULL || pPager->
60d0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
60e0: 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  OK );.  if(.    
60f0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
6100: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
6110: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
6120: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
6130: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
6140: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
6150: 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
6160: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
6170: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6180: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
6190: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
61a0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
61b0: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
61c0: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
61d0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
61e0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
61f0: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
6200: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
6210: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6220: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
6230: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
6240: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
6250: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
6260: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
6270: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
6280: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
6290: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
62a0: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
62b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
62c0: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
62d0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
62e0: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
62f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
6300: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
6310: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
6320: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
6330: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
6340: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
6350: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
6380: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
6390: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
63a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
63b0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
63c0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
63d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
63e0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
63f0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
6400: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
6410: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
6420: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
6430: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
6440: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
6450: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
6460: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
6470: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
6480: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
6490: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
64a0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
64b0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
64c0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
64d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
64e0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
64f0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
6500: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
6510: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
6520: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
6530: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
6540: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
6550: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
6560: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
6570: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
6580: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
6590: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
65a0: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
65b0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
65c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
65d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
65e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
65f0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6600: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6610: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6620: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
6630: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
6640: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
6650: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
6660: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
6670: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
6680: 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74  alloc(). *pzMast
6690: 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  er is.** set to 
66a0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d  point at the mem
66b0: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
66c0: 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
66d0: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73  caller must.** s
66e0: 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d  qliteFree() *pzM
66f0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
6700: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
6710: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
6720: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
6730: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
6740: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
6750: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
6760: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
6770: 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a  Journal(OsFile *
6780: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a  pJrnl, char **pz
6790: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
67a0: 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20  c;.  u32 len;.  
67b0: 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63  i64 szJ;.  u32 c
67c0: 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ksum;.  int i;. 
67d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
67e0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
67f0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6800: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6810: 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  /..  *pzMaster =
6820: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
6830: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6840: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
6850: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6860: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
6870: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
6880: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
6890: 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69  nl, szJ-16);.  i
68a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
68b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a   ) return rc;. .
68c0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
68d0: 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a  s(pJrnl, &len);.
68e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
68f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6900: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6910: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75  its(pJrnl, &cksu
6920: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
6930: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6940: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6950: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6960: 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20  , aMagic, 8);.  
6970: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6980: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
6990: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
69a0: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
69b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
69c0: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
69d0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
69e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
69f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6a00: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68   *pzMaster = (ch
6a10: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
6a20: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  c(len+1);.  if( 
6a30: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
6a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6a50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
6a60: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
6a70: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
6a80: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
6a90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6aa0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
6ab0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
6ac0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
6ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6ae0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
6af0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
6b00: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
6b10: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
6b20: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
6b30: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
6b40: 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d  = (*pzMaster)[i]
6b50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6b60: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6b70: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6b80: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
6b90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6ba0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
6bb0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
6bc0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
6bd0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
6be0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6bf0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6c00: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6c10: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6c20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6c30: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6c40: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6c50: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6c60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
6c70: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
6c80: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
6c90: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
6ca0: 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c     (*pzMaster)[l
6cb0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  en] = '\0';.  }.
6cc0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
6cd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6ce0: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
6cf0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6d00: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
6d10: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
6d20: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
6d30: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
6d40: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
6d50: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6d60: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
6d70: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
6d80: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
6d90: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
6da0: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
6db0: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
6dd0: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
6e90: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a  static int seekJ
6ea0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
6eb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
6ec0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
6ed0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
6ee0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6ef0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
6f00: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
6f10: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6f20: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
6f30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6f40: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6f50: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
6f60: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
6f70: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
6f80: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
6f90: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
6fa0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6fb0: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
6fc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
6fd0: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73  fset;.  return s
6fe0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
6ff0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
7000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
7020: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
7030: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
7040: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7050: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
7060: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
7070: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
7080: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
7090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
70a0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
70b0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
70c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
70d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
70e0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
70f0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
7100: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
7110: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
7120: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
7130: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
7140: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
7150: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
7160: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
7170: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
7180: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
7190: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
71a0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
71b0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
71c0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
71d0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
71e0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
71f0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
7200: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
7210: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7220: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
7230: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
7240: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
7250: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
7260: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
7270: 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a  Pager){.  char z
7280: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7290: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
72a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
72b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
72c0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
72d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
72e0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
72f0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20  rnalOff;.  }..  
7300: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
7310: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
7320: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7330: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7340: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
7350: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7370: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
7380: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
7390: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
73a0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
73b0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
73c0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
73d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
73e0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
73f0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
7400: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
7410: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
7420: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
7430: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
7440: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
7450: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
7460: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
7470: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
7480: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
7490: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
74a0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
74b0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
74c0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
74d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
74e0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
74f0: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
7500: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
7510: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
7520: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
7530: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7540: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
7550: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
7560: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
7570: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
7580: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
7590: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
75a0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
75b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
75c0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
75d0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
75e0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
75f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7600: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
7610: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
7620: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
7630: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
7640: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7650: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7660: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
7670: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
7680: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
7690: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
76a0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
76b0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
76c0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
76d0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
76e0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
76f0: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
7700: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
7710: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
7720: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
7730: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
7740: 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ).  rc = sqlite3
7750: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7760: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
7770: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
7780: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
7790: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
77a0: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
77b0: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
77c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
77d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
77e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
77f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
7800: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
7810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7820: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
7830: 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e  "JTAIL %p %lld\n
7840: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
7850: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
7860: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
7870: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
7880: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
7890: 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20  urnalOff-1);.   
78a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
78b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
78c0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
78d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
78e0: 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  00", 1);.    }. 
78f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7900: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
7910: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
7920: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
7930: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
7940: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
7950: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
7960: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
7970: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
7980: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
7990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
79a0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
79b0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
79c0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
79d0: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
79e0: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
79f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
7a00: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
7a10: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
7a20: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
7a30: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
7a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
7a50: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
7a60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
7a70: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
7a80: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
7a90: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
7aa0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
7ab0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
7ac0: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
7ad0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
7ae0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
7af0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
7b00: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
7b10: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
7b20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7b30: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
7b40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7b50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
7b60: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
7b70: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
7b80: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
7b90: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
7ba0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
7bb0: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
7bc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
7bd0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
7be0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
7bf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
7c00: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7c10: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
7c20: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
7c30: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
7c40: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
7c50: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
7c60: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
7c70: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
7c80: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
7c90: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
7ca0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7cb0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7cc0: 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ader */..  rc = 
7cd0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
7ce0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
7cf0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7d00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
7d10: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
7d20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
7d30: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
7d40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7d50: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
7d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7d70: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
7d80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
7d90: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
7da0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7db0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
7dc0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
7dd0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7de0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
7df0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7e00: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
7e10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7e20: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
7e30: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7e40: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
7e50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7e60: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
7e70: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
7e80: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7e90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
7ea0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
7eb0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
7ec0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7ed0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
7ee0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
7ef0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
7f00: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
7f10: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
7f20: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
7f30: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
7f40: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7f50: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7f60: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7f70: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7f80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7f90: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
7fa0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
7fb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7fc0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
7fd0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
7fe0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
7ff0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
8000: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
8010: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
8020: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8030: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
8040: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
8050: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
8060: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
8070: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8080: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
8090: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
80a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
80b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
80c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
80d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
80e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
80f0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
8100: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8110: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8120: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
8130: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
8140: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
8150: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
8160: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
8170: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
8180: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
8190: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
81a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
81b0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
81c0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
81d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
81e0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
81f0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
8200: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
8210: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
8220: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
8230: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
8240: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
8250: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
8260: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
8270: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8280: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
8290: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
82a0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
82b0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
82c0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
82d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
82e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
82f0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
8300: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
8310: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
8320: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
8330: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
8340: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
8350: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
8360: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
8370: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
8380: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
8390: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
83a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
83b0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
83c0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
83d0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
83e0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
83f0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
8400: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
8410: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20  u32 cksum = 0;. 
8420: 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f   char zBuf[sizeo
8430: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8440: 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a  +2*4];..  if( !z
8450: 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72  Master || pPager
8460: 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74  ->setMaster) ret
8470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8480: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8490: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
84a0: 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29   strlen(zMaster)
84b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
84c0: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
84d0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
84e0: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
84f0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8500: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
8510: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
8520: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
8530: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
8540: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
8550: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
8560: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
8570: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
8580: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
8590: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
85a0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
85b0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
85c0: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
85d0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
85e0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
85f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8620: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
8630: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
8640: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
8650: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
8660: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
8670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8690: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
86a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
86b0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
86c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
86d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
86e0: 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c   put32bits(zBuf,
86f0: 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69   len);.  put32bi
8700: 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73  ts(&zBuf[4], cks
8710: 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  um);.  memcpy(&z
8720: 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c  Buf[8], aJournal
8730: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
8740: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
8750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
8760: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
8770: 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66  , zBuf, 8+sizeof
8780: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
8790: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
87a0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
87b0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
87c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
87d0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
87e0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
87f0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
8800: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
8810: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8820: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
8830: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
8840: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
8850: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
8860: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
8870: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8880: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
8890: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
88a0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
88b0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
88c0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
88d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
88e0: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
88f0: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
8900: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
8910: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
8920: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
8930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8940: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
8950: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
8960: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
8970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
8980: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
8990: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
89a0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
89b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
89c0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
89d0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
89e0: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
89f0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
8a00: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
8a10: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
8a20: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
8a30: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
8a40: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
8a50: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
8a60: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
8a70: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
8a80: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
8a90: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
8aa0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
8ab0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
8ac0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
8ad0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
8ae0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
8af0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
8b00: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
8b10: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
8b20: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
8b30: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
8b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
8b50: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
8b60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
8b70: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
8b80: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
8b90: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
8ba0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
8bb0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
8bc0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
8bd0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
8be0: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
8bf0: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
8c00: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
8c10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8c20: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
8c30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8c50: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
8c60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
8c70: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
8c80: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8c90: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
8ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
8cb0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
8cc0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
8cd0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
8ce0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
8cf0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
8d00: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
8d10: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
8d20: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
8d30: 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  OCK;.    pPager-
8d40: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
8d50: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
8d60: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
8d70: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
8d80: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
8d90: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
8da0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
8db0: 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  e. This is a no-
8dc0: 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20  op if the pager 
8dd0: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
8de0: 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  red.** the error
8df0: 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  -state..*/.stati
8e00: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
8e10: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
8e20: 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ger *p){.  if( p
8e30: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
8e40: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
8e50: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
8e60: 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75  SERVED || p->jou
8e70: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
8e80: 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50   if( p->state>=P
8e90: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
8ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8eb0: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
8ec0: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
8ed0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
8ee0: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
8ef0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
8f00: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
8f10: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
8f20: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
8f30: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
8f40: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
8f50: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
8f60: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
8f70: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
8f80: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
8f90: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
8fa0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
8fb0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
8fc0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
8fd0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
8fe0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
8ff0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
9000: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
9010: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
9020: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
9030: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
9040: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
9050: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
9060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
9070: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
9080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9090: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
90a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
90b0: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
90c0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
90d0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
90e0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54  =pNext){.    IOT
90f0: 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
9100: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
9110: 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
9120: 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
9130: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
9140: 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65  _count);.    pNe
9150: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
9160: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
9170: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
9180: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
9190: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
91a0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
91b0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
91c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
91d0: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
91e0: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70  r->pAll = 0;.  p
91f0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
9200: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
9210: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
9220: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
9230: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
9240: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
9250: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
9260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9270: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
9280: 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61  ction.  A transa
9290: 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62  ction is ended b
92a0: 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f  y either.** a CO
92b0: 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
92c0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  CK..**.** When t
92d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
92e0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
92f0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
9300: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
9310: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
9320: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
9330: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
9340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
9350: 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ll release.** th
9360: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
9370: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
9380: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
9390: 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20  s place if that 
93a0: 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  is.** the approp
93b0: 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64  riate thing to d
93c0: 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b  o.  Release lock
93d0: 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70  s usually is app
93e0: 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c  ropriate,.** unl
93f0: 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78  ess we are in ex
9400: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
9410: 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68  ode or unless th
9420: 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d  is is a .** COMM
9430: 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20  IT AND BEGIN or 
9440: 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47  ROLLBACK AND BEG
9450: 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  IN operation..**
9460: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9470: 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64  file is either d
9480: 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61  eleted or trunca
9490: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ted..**.** TODO:
94a0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
94b0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
94c0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
94d0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
94e0: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
94f0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
9500: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
9510: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
9520: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
9530: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
9540: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
9550: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9560: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
9570: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9580: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
9590: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
95a0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
95b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
95c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
95d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
95e0: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
95f0: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
9600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
9620: 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
9630: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9640: 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67  tmtOpen && !pPag
9650: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9660: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
9670: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
9680: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
9690: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
96a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
96b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
96c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
96d0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
96e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
96f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
9700: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
9710: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
9720: 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c  OK ){;.      sql
9730: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
9740: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
9750: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9760: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
9770: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
9780: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
9790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
97a0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
97b0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
97c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
97d0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
97e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
97f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
9800: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9810: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
9820: 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  al);.      }.   
9830: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
9840: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
9850: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
9860: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
9870: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
9880: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
9890: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
98a0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
98b0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
98c0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
98d0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
98e0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
98f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
9900: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
9910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9920: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
9930: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9940: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9950: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9960: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
9970: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
9980: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
9990: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
99a0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
99b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
99c0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
99d0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
99e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
99f0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
9a00: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
9a10: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  l==0 );.  }..  i
9a20: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
9a30: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
9a40: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73   rc2 = sqlite3Os
9a50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
9a60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
9a70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9a80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
9a90: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
9aa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
9ab0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
9ac0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9ad0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
9ae0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
9af0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
9b00: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9b10: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
9b20: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9b30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
9b40: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
9b50: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61  r->pFirst;.  pPa
9b60: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
9b70: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
9b80: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
9b90: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
9ba0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
9bb0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
9bc0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
9be0: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
9bf0: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
9c00: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
9c10: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
9c20: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
9c30: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
9c40: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
9c50: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
9c60: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
9c70: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
9c80: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
9c90: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
9ca0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
9cb0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
9cc0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
9cd0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
9ce0: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
9cf0: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
9d00: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
9d10: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
9d20: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
9d30: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
9d40: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
9d50: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
9d60: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
9d70: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
9d80: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
9d90: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
9da0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
9db0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
9dc0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
9dd0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
9de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
9df0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
9e00: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
9e10: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
9e20: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
9e30: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
9e40: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
9e50: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
9e60: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
9e70: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
9e80: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
9e90: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
9ea0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
9eb0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
9ec0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
9ed0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
9ee0: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
9ef0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
9f00: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
9f10: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
9f20: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
9f30: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
9f40: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
9f50: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
9f60: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
9f70: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
9f80: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
9f90: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
9fa0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
9fb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
9fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9fd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
9fe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
9ff0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a000: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
a010: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
a020: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
a030: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
a040: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
a050: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
a060: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
a070: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
a080: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
a090: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
a0a0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
a0b0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
a0c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a0d0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
a0e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a0f0: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
a100: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
a110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
a120: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
a130: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
a140: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
a150: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
a160: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
a170: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
a180: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
a190: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
a1a0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
a1b0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
a1c0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
a1d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
a1e0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
a1f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a200: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
a210: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
a220: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
a230: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
a240: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
a250: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
a260: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
a270: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
a280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a290: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
a2a0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
a2b0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
a2c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a2d0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
a2e0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
a2f0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
a300: 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a  8 *aData = (u8 *
a310: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
a320: 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74  ce;   /* Temp st
a330: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
a340: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
a350: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
a360: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
a370: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
a380: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
a390: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
a3a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
a3b0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
a3c0: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
a3d0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
a3e0: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
a3f0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
a400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44   );.  assert( aD
a410: 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72  ata );..  rc = r
a420: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
a430: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
a440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
a450: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
a460: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
a470: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a480: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
a490: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a4a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
a4b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a4c0: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
a4d0: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
a4e0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
a4f0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
a500: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
a510: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
a520: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
a530: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
a540: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
a550: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a560: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
a570: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
a580: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
a590: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
a5a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
a5b0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
a5c0: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
a5d0: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
a5e0: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
a5f0: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
a600: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
a610: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
a620: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
a630: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
a650: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
a660: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
a670: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
a680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
a6a0: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
a6b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
a6c0: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
a6d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a6e0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
a6f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
a700: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
a710: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
a720: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
a730: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a740: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
a750: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
a760: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
a770: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
a780: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a790: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a7a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
a7b0: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
a7c0: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
a7d0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
a7e0: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
a7f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
a800: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
a810: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
a820: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
a830: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
a840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a850: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
a860: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
a870: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
a880: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
a890: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
a8a0: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
a8b0: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
a8c0: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
a8d0: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
a8e0: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
a8f0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
a900: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
a910: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
a920: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
a930: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
a940: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
a950: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
a960: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
a970: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
a980: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
a990: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
a9a0: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
a9b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
a9c0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
a9d0: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
a9e0: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
a9f0: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
aa00: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
aa10: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
aa20: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
aa30: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
aa40: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
aa50: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
aa60: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
aa70: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
aa80: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
aa90: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
aaa0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
aab0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
aac0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
aad0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
aae0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
aaf0: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ab00: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ab10: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
ab20: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
ab30: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
ab40: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
ab50: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
ab60: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
ab70: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
ab80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
ab90: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
aba0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
abb0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
abc0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
abd0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
abe0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
abf0: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
ac00: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
ac10: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
ac20: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ac30: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ac40: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
ac50: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
ac60: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
ac70: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
ac80: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
ac90: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
aca0: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
acb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
acc0: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
acd0: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
ace0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
acf0: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
ad00: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
ad10: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
ad20: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
ad30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ad40: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
ad50: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
ad60: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
ad70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
ad80: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ad90: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
ada0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
adb0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
adc0: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
add0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ade0: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
adf0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ae00: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
ae10: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
ae20: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ae30: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ae40: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
ae50: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ae60: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
ae70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ae80: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
ae90: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
aea0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
aeb0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
aec0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
aed0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
aee0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
aef0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
af00: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
af10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
af20: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
af30: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
af40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
af50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
af60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
af70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
af80: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
af90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
afa0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
afb0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
afc0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
afd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
afe0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
aff0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
b000: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
b010: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
b020: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
b030: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
b040: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
b050: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
b060: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
b070: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
b080: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
b090: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
b0a0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
b0b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
b0c0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
b0d0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
b0e0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
b0f0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
b100: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
b110: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
b120: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
b130: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
b140: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
b150: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
b160: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
b170: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
b180: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
b190: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
b1a0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
b1b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
b1c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
b1d0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
b1e0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
b1f0: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
b200: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
b210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
b220: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
b230: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
b240: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
b250: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
b260: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
b270: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
b280: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
b290: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
b2a0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
b2b0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
b2c0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
b2d0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
b2e0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
b2f0: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
b300: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
b310: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
b320: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
b330: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
b340: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
b350: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
b360: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
b370: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
b380: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
b390: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
b3b0: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
b3c0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
b3d0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
b3e0: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
b3f0: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
b400: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
b410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
b420: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
b430: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
b440: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
b450: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
b460: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
b470: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b480: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
b490: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
b4a0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
b4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
b4c0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
b4d0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
b4e0: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
b4f0: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
b500: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
b510: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
b520: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
b530: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
b540: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
b550: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
b560: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
b570: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
b580: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
b590: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
b5a0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
b5b0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
b5c0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
b5d0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
b5e0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
b5f0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
b600: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
b610: 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a  le *master = 0;.
b620: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
b630: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
b640: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
b650: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
b660: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
b670: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
b680: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
b690: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
b6a0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
b6b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b6c0: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
b6d0: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
b6e0: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
b6f0: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
b700: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
b710: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
b720: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
b730: 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ce..  */.  rc = 
b740: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
b750: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
b760: 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  master);.  asser
b770: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
b780: 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a 20 20   || master );.  
b790: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b7a0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b7b0: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
b7c0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20  _open = 1;.  rc 
b7d0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b7e0: 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ize(master, &nMa
b7f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
b800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b810: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b820: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
b830: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
b840: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
b850: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
b860: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
b870: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
b880: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
b890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
b8a0: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
b8b0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
b8c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
b8d0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
b8e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
b8f0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
b900: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
b910: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
b920: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
b930: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
b940: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
b950: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
b960: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
b970: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b980: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
b990: 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74  lite3OsRead(mast
b9a0: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
b9b0: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
b9c0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
b9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b9e0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b9f0: 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
ba00: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
ba10: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
ba20: 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
ba30: 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
ba40: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
ba50: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
ba60: 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20  xists(zJournal) 
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
ba80: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ba90: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
baa0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
bab0: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
bac0: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
bad0: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
bae0: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
baf0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
bb00: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
bb10: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
bb20: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
bb30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
bb40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bb50: 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61    OsFile *journa
bb60: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
bb70: 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  nt c;..        r
bb80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
bb90: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
bba0: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
bbb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
bbc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
bbd0: 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  journal );.     
bbe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bc00: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
bc10: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
bc20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
bc30: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
bc40: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
bc50: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
bc60: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
bc70: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
bc80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bc90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
bca0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
bcb0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
bcc0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
bcd0: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
bce0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
bcf0: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
bd00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
bd10: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
bd20: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
bd30: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
bd40: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
bd50: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
bd60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bd70: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
bd80: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
bd90: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
bdb0: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
bdc0: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
bdd0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
bde0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
bdf0: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
be00: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
be10: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
be20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
be30: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
be40: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
be50: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
be60: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
be70: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
be80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
be90: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
bea0: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
beb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
bec0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
bed0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
bee0: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
bef0: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
bf00: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
bf10: 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e  cated. Also trun
bf20: 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20  cate the cached 
bf30: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
bf40: 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  f the file..*/.s
bf50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bf60: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
bf70: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
bf80: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
bf90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
bfa0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
bfb0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
bfc0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
bfd0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
bfe0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
bff0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
c000: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
c010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c020: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
c030: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
c040: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
c050: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
c060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c080: 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72  e sectorSize for
c090: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
c0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74  ..**.** The sect
c0b0: 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c  or size is the l
c0c0: 61 72 67 65 72 20 6f 66 20 74 68 65 20 73 65 63  arger of the sec
c0d0: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
c0e0: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
c0f0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e  sSectorSize() an
c100: 64 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a  d the pageSize..
c110: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c120: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
c130: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
c140: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c150: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
c160: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
c170: 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  fd);.  if( pPage
c180: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70 50  r->sectorSize<pP
c190: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
c1a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
c1b0: 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67 65  ctorSize = pPage
c1c0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
c1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c1e0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
c1f0: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
c200: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c210: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
c220: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
c230: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
c240: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
c250: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
c260: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
c270: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
c280: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
c290: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
c2a0: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
c2b0: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
c2c0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
c2d0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c2e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
c2f0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
c300: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
c310: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
c320: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
c330: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
c340: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
c350: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
c360: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
c370: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
c380: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
c390: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
c3a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c3b0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
c3c0: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
c3d0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
c3e0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
c3f0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
c400: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c410: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
c420: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
c430: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
c440: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
c450: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
c460: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c470: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
c480: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
c490: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
c4a0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
c4b0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
c4c0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
c4d0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
c4e0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
c4f0: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
c500: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
c510: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c520: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
c530: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
c540: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
c550: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
c560: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
c570: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
c580: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
c590: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
c5a0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
c5b0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
c5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
c5d0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
c5e0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
c5f0: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
c600: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
c610: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
c620: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
c630: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
c640: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
c650: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
c660: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
c670: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
c680: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
c690: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
c6a0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
c6b0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
c6c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
c6d0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
c6e0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
c6f0: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
c700: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
c710: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
c720: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
c730: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
c740: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
c750: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
c760: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
c770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
c780: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
c790: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
c7a0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
c7b0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
c7c0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
c7d0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
c7e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c7f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
c800: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
c810: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
c820: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
c830: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
c840: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
c850: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
c860: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c870: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
c880: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
c890: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
c8a0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
c8b0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
c8c0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
c8d0: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
c8e0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
c8f0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
c900: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
c910: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
c920: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
c930: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
c940: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
c950: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
c960: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
c970: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
c980: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
c990: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
c9a0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
c9b0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
c9c0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
c9d0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
c9e0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
c9f0: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
ca00: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
ca10: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
ca20: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
ca30: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
ca40: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
ca50: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
ca60: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
ca70: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ca80: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
ca90: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
caa0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
cab0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
cac0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
cad0: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
cae0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
caf0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
cb00: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
cb10: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
cb20: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
cb30: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
cb40: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
cb50: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
cb60: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
cb70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
cb80: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
cb90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
cba0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
cbb0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
cbc0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
cbd0: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
cbe0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
cbf0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
cc00: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
cc10: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
cc20: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
cc30: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
cc40: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
cc50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cc60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cc70: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
cc80: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
cc90: 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
cca0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
ccb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ccc0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ccd0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
cce0: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cd10: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
cd20: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cd50: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
cd60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
cd70: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
cd80: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
cd90: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
cdc0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
cdd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
cde0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
cdf0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
ce00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
ce10: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
ce20: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
ce30: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
ce40: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
ce50: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
ce60: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
ce70: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
ce80: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ce90: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
cea0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ceb0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
cec0: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
ced0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
cee0: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
cef0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
cf00: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
cf10: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
cf20: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
cf30: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
cf40: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
cf50: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
cf60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cf70: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
cf80: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
cf90: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
cfa0: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
cfb0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
cfc0: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
cfd0: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
cfe0: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
cff0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
d000: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
d010: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
d020: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
d030: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d040: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d050: 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
d060: 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46  r && !sqlite3OsF
d070: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
d080: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
d090: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
d0a0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
d0b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d0c0: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
d0d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
d0e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d0f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
d100: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
d110: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
d120: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
d130: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
d140: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
d150: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
d160: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
d170: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
d180: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
d190: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d1a0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
d1b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
d1c0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
d1d0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
d1e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
d1f0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
d200: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
d210: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
d220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
d230: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
d240: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
d250: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
d260: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
d270: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
d280: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
d290: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
d2a0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
d2b0: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
d2c0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
d2d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
d2e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d2f0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
d300: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
d310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
d320: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d330: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
d340: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d350: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
d360: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
d370: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
d380: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
d390: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
d3a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
d3b0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
d3c0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
d3d0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
d3e0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
d3f0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
d400: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
d410: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
d420: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
d430: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
d440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
d450: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
d460: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
d470: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
d480: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
d490: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
d4a0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
d4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
d4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
d4d0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
d4e0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
d4f0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
d500: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d510: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
d520: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
d530: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
d540: 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
d550: 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
d560: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
d570: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
d580: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49     ** process. I
d590: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
d5a0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
d5b0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73 74  nal file consist
d5c0: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  s of.    ** jour
d5d0: 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f 66  nalled copies of
d5e0: 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
d5f0: 20 74 6f 20 62 65 20 72 65 61 64 20 62 61 63 6b   to be read back
d600: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 2e   into the cache.
d610: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d620: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
d630: 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  t ){.      nRec 
d640: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
d660: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
d670: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
d680: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
d690: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
d6a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
d6b0: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
d6c0: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
d6d0: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
d6e0: 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
d6f0: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
d700: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
d710: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
d720: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
d730: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
d740: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
d750: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
d760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d780: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d7a0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
d7b0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d7c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
d7d0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
d7e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
d7f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d800: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
d810: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
d820: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d830: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d840: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d850: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d870: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d880: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
d890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
d8b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d8c0: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
d8d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
d8f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d900: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d920: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
d930: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
d940: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
d950: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d960: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d970: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
d980: 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
d990: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
d9a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
d9b0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
d9c0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
d9d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
d9e0: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
d9f0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
da00: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
da10: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
da20: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
da30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
da40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
da50: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
da60: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
da70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
da80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
da90: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
daa0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
dab0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
dac0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
dad0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
dae0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
daf0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
db00: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
db10: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
db20: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
db30: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
db40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
db50: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
db60: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
db70: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
db80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
db90: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
dba0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
dbb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
dbc0: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
dbd0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
dbe0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
dbf0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
dc00: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
dc10: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
dc20: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
dc30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
dc40: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
dc50: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
dc60: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
dc70: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
dc80: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
dc90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
dcb0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
dcc0: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
dcd0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dce0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
dcf0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
dd00: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
dd10: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
dd20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
dd30: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
dd40: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
dd50: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
dd60: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
dd70: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
dd80: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
dd90: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
dda0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
ddb0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ddc0: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
ddd0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
dde0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
de00: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
de10: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
de40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
de50: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
de60: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
de70: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
de80: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
de90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
dea0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
deb0: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
dec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ded0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
dee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
def0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
df00: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
df10: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
df20: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
df30: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
df40: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
df50: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
df60: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
df70: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
df80: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
df90: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
dfa0: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
dfb0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
dfc0: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
dfd0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
dfe0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
dff0: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
e000: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
e010: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
e020: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
e030: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
e040: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
e050: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
e060: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
e070: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
e080: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
e090: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
e0a0: 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
e0b0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e0c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
e0d0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
e0e0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e0f0: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
e100: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
e110: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
e120: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
e130: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
e140: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e150: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
e160: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e170: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
e180: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
e190: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
e1a0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
e1b0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
e1c0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
e1d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
e1e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
e1f0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
e200: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e210: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
e220: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e230: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
e240: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
e250: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
e260: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
e270: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
e280: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
e290: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
e2a0: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
e2b0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
e2c0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
e2d0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
e2e0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
e2f0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
e300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e310: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e320: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e330: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
e340: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e350: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
e360: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
e370: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
e380: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
e390: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
e3a0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
e3b0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
e3c0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
e3d0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
e3e0: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
e3f0: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
e400: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
e410: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
e420: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
e430: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
e440: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
e450: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
e460: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
e470: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
e480: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
e490: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
e4a0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
e4b0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e4c0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
e4d0: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
e4e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e4f0: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
e500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
e510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
e520: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
e530: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e540: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
e550: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
e560: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
e570: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
e580: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
e590: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e5a0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
e5b0: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
e5c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e5d0: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
e5e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e5f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e600: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e610: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
e620: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e630: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
e640: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e650: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
e660: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
e670: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
e680: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
e690: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
e6a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
e6b0: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
e6c0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
e6d0: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
e6e0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
e6f0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
e700: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
e710: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
e730: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e740: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
e750: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
e760: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
e770: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
e780: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
e790: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
e7a0: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
e7b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
e7c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e7d0: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
e7e0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
e7f0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
e800: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
e810: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
e820: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
e830: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
e840: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
e850: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e860: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e870: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e880: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e8a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e8b0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
e8c0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
e8d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e8e0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
e8f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
e900: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
e910: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
e920: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
e930: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e940: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
e950: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
e960: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
e970: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
e980: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
e990: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
e9a0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
e9b0: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
e9c0: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
e9d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
e9e0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
e9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
ea00: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
ea10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
ea20: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
ea30: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
ea40: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
ea50: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
ea60: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
ea70: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
ea80: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
ea90: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
eaa0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
eab0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
eac0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
ead0: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
eae0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
eaf0: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
eb00: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
eb10: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
eb20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
eb30: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
eb40: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
eb50: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
eb60: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
eb70: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
eb80: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
eb90: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
ebb0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
ebc0: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
ebd0: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
ebe0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ebf0: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
ec00: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
ec10: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
ec20: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
ec30: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
ec40: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
ec50: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
ec60: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
ec70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
ec80: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
ec90: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
eca0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
ecb0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
ecc0: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
ecd0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
ece0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
ecf0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
ed00: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
ed10: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
ed20: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ed30: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
ed40: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
ed50: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
ed60: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
ed70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ed80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ed90: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
eda0: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
edb0: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
edc0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
edd0: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
ede0: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
edf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
ee00: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
ee10: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
ee20: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
ee30: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
ee40: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
ee50: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
ee60: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
ee70: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
ee90: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
eea0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
eeb0: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
eec0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
eed0: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
eee0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
eef0: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
ef00: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
ef10: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
ef20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef30: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
ef40: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
ef50: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
ef60: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
ef70: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
ef80: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
ef90: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
efa0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
efb0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
efc0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
efd0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
efe0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
eff0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
f000: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
f010: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
f020: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
f030: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
f040: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
f050: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f060: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
f070: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
f080: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
f090: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
f0a0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
f0b0: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
f0c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
f0d0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
f0e0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
f0f0: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
f100: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
f110: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
f120: 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
f130: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
f140: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
f150: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
f160: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
f170: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
f180: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f190: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
f1a0: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
f1b0: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
f1c0: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
f1d0: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
f1e0: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
f1f0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
f200: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
f210: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
f220: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
f230: 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a  entemp(OsFile **
f240: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
f250: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
f260: 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49   char zFile[SQLI
f270: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
f280: 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ];..#ifdef SQLIT
f290: 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
f2a0: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
f2b0: 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
f2c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
f2d0: 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
f2e0: 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  dif.  do{.    cn
f2f0: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
f300: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
f310: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
f320: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
f330: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46  lusive(zFile, pF
f340: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
f350: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f360: 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77   || *pFd );.  }w
f370: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
f380: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
f390: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
f3a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
f3c0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
f3d0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
f3e0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
f3f0: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
f400: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
f410: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
f420: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
f430: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
f440: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
f450: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
f460: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
f470: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
f480: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
f490: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
f4a0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
f4b0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
f4c0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
f4d0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
f4e0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
f4f0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
f500: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
f510: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
f520: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
f530: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
f540: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
f550: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
f560: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
f570: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
f580: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
f590: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
f5a0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
f5b0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
f5c0: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
f5d0: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
f5e0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
f5f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
f600: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f610: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
f620: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
f630: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
f640: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f650: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
f660: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
f670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
f680: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
f690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f6a0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
f6b0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6d0: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
f6e0: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
f6f0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
f700: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
f710: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
f720: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
f730: 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  s file */.){.  P
f740: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
f750: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
f760: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
f770: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20  nt nameLen;  /* 
f780: 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e  Compiler is wron
f790: 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  g. This is alway
f7a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  s initialized be
f7b0: 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73  fore use */.  Os
f7c0: 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20  File *fd = 0;.  
f7d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f7e0: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
f7f0: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
f800: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
f810: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
f820: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
f830: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
f840: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
f850: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
f860: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
f870: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
f880: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
f890: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
f8a0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
f8b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f8c0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
f8d0: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
f8e0: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
f8f0: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
f900: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
f910: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
f920: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
f930: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
f940: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
f950: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
f960: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
f970: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
f980: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
f990: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
f9a0: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
f9b0: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
f9c0: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
f9d0: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
f9e0: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
f9f0: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
fa00: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
fa10: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
fa20: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
fa30: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
fa40: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
fa50: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
fa60: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
fa70: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
fa80: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
fa90: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
faa0: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
fab0: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
fac0: 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20 74   /* We used to t
fad0: 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  est if malloc() 
fae0: 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69 6c  had already fail
faf0: 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ed before procee
fb00: 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20  ding. .  ** But 
fb10: 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75 6e  the way this fun
fb20: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
fb30: 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74 68   SQLite means th
fb40: 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a  at can never.  *
fb50: 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68 65  * happen. Furthe
fb60: 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d 61  rmore, if the ma
fb70: 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
fb80: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 2c   is already set,
fb90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74 68   .  ** either th
fba0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
fbb0: 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c 69  StrDup() or sqli
fbc0: 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77  teMalloc() below
fbd0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20   will.  ** fail 
fbe0: 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c 49  shortly and SQLI
fbf0: 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65  TE_NOMEM returne
fc00: 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  d anyway..  */. 
fc10: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
fc20: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
fc30: 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ger file and set
fc40: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74   zFullPathname t
fc50: 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f  o point at mallo
fc60: 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f  c()ed .  ** memo
fc70: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
fc80: 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e  e complete filen
fc90: 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64  ame (i.e. includ
fca0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
fcb0: 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  y)..  */.  if( z
fcc0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
fcd0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
fce0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fcf0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
fd00: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
fd10: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
fd20: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
fd30: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
fd40: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
fd50: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
fd60: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
fd70: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
fd80: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
fd90: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
fda0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
fdb0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
fdc0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
fdd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
fde0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
fdf0: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
fe00: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
fe10: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
fe20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20 29  QLITE_OK || fd )
fe30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fe40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
fe50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
fe60: 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20  entemp(&fd);.   
fe70: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
fe80: 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20  leName(zTemp);. 
fe90: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
fea0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
feb0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
fec0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
fed0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
fee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fef0: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
ff00: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
ff10: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
ff20: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
ff30: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
ff40: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
ff50: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
ff60: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
ff70: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
ff80: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
ff90: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
ffa0: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
ffb0: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
ffc0: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
ffd0: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
ffe0: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
fff0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
10000 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
10010 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10020 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
10030 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
10040 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
10050 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
10060 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26     if( pPager &&
10070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10080 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10090 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61  pTmpSpace = (cha
100a0 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
100b0 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Raw(SQLITE_DEFAU
100c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
100d0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
100e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
100f0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
10100 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
10110 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f  e, free the memo
10120 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64  ry .  ** pointed
10130 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68   to by zFullPath
10140 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50  name, free the P
10150 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
10160 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20  nd close the .  
10170 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74  ** file. Since t
10180 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
10190 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
101a0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
101b0 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
101c0 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
101d0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
101e0 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c  !pPager || !zFul
101f0 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50  lPathname || !pP
10200 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
10210 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
10220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10230 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
10240 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
10250 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
10260 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
10270 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
10280 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
10290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
102a0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
102b0 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
102c0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
102d0 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
102e0 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
102f0 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
10300 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
10310 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
10320 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
10330 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
10340 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
10350 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
10360 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
10370 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
10380 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
10390 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
103a0 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
103b0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
103c0 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
103d0 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e  athname, nameLen
103e0 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50  +1);.  memcpy(pP
103f0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10400 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , zFullPathname,
10410 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20   nameLen+1);..  
10420 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
10430 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
10440 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
10450 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
10460 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
10470 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
10480 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   0;.  memcpy(pPa
10490 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
104a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 61 6d  FullPathname,nam
104b0 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46  eLen);.  sqliteF
104c0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
104d0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
104e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
104f0 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
10500 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  al",sizeof("-jou
10510 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50 61 67 65  rnal"));.  pPage
10520 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
10530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10540 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
10550 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
10560 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
10570 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
10580 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
10590 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
105a0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
105b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
105c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
105d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
105e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
105f0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
10600 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10610 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
10620 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
10630 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10640 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
10650 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10660 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
10670 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
10680 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10690 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
106a0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
106b0 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
106c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
106d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
106e0 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28 20 50  UNT;.  assert( P
106f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29  AGER_UNLOCK==0 )
10700 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
10710 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
10720 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
10730 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
10740 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
10750 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
10760 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
10770 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
10780 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
10790 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
107a0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
107b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
107c0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
107d0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
107e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
107f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
10800 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
10810 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
10820 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
10830 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
10840 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
10850 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
10860 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
10870 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
10880 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
10890 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
108a0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
108b0 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
108c0 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
108d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
108e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
108f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10900 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
10910 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
10920 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
10930 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
10940 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
10950 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c  );.  assert(fd||
10960 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d  memDb);.  if( !m
10970 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53  emDb ){.    setS
10980 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
10990 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  );.  }.  /* pPag
109a0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
109b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
109c0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
109d0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
109e0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
109f0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
10a00 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51  Pager;.#ifdef SQ
10a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
10a20 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
10a30 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
10a40 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20  pTsd->pPager;.  
10a50 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
10a60 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
10a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10a90 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
10aa0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
10ab0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
10ac0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
10ad0 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
10ae0 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
10af0 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
10b00 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
10b10 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
10b20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
10b30 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
10b40 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
10b50 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
10b60 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
10b70 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
10b80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
10b90 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
10ba0 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
10bb0 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
10bc0 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
10bd0 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
10be0 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
10bf0 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
10c00 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
10c10 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
10c20 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
10c30 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
10c40 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
10c50 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
10c60 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
10c70 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
10c80 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
10c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10ca0 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
10cb0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
10cc0 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
10cd0 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
10ce0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
10cf0 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
10d00 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
10d10 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
10d20 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
10d30 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
10d40 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
10d50 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
10d60 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
10d70 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
10d80 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
10d90 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
10da0 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
10db0 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
10dc0 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
10dd0 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
10de0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
10df0 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
10e00 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
10e10 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
10e20 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
10e30 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
10e40 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
10e50 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
10e60 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
10e70 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
10e80 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
10e90 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
10ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10eb0 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
10ec0 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
10ed0 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
10ee0 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
10ef0 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
10f00 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
10f10 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
10f20 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
10f30 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
10f40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
10f50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10f70 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
10f80 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
10f90 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
10fa0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
10fb0 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
10fc0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
10fd0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
10fe0 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  =0 ){.    pager_
10ff0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
11000 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
11010 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
11020 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
11030 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 52  Space = sqlite3R
11040 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
11050 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  ger->pTmpSpace, 
11060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
11070 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11080 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
11090 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
110a0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
110b0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
110c0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
110d0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
110e0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
110f0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
11100 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
11110 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
11120 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
11130 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
11140 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
11150 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
11160 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
11170 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
11180 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
11190 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
111a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
111b0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
111c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
111d0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
111e0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
111f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
11200 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
11210 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
11220 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11230 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
11240 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
11250 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
11260 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
11270 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
11280 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
11290 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
112a0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
112b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
112c0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
112d0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
112e0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
112f0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
11300 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
11310 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
11320 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
11330 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
11340 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
11350 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
11360 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
11370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
11380 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
11390 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
113a0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
113b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
113c0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
113d0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
113e0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
113f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11400 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
11410 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
11420 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
11430 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11440 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
11450 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
11460 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11470 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
11480 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
11490 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
114a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
114b0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
114c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
114d0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
114e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
114f0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
11500 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
11510 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
11520 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11530 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
11540 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
11550 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
11560 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
11570 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
11580 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
11590 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
115a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
115b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
115c0 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
115d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
115e0 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
115f0 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
11600 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
11610 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
11620 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
11630 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
11640 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
11650 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
11660 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
11670 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
11680 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
11690 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
116a0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
116b0 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
116c0 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
116d0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
116e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
116f0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
11700 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
11710 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
11720 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
11730 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
11740 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
11750 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
11760 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c  =0 ){.    disabl
11770 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11780 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
11790 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
117a0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 65  r->fd, 0);.    e
117b0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
117c0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
117d0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
117e0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
117f0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
11800 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11810 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
11820 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  t, N);.    if( r
11830 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
11840 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
11850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11860 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
11870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11880 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
11890 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
118a0 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
118b0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
118c0 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
118d0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
118e0 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
118f0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
11900 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
11910 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
11920 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
11930 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
11940 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
11950 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
11960 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
11970 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
11980 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
11990 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
119a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
119b0 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
119c0 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
119d0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
119e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
119f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
11a00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11a10 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
11a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a30 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
11a40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
11a50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11a60 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
11a70 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
11a80 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
11a90 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
11aa0 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
11ab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11ac0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
11ad0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
11ae0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
11af0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
11b00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11b10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
11b20 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
11b30 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
11b40 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
11b50 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
11b60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
11b70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
11b80 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
11b90 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
11ba0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
11bb0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
11bc0 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
11bd0 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
11be0 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
11bf0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
11c00 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
11c10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
11c20 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
11c30 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
11c40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11c50 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
11c60 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
11c70 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
11c80 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
11c90 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
11ca0 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
11cb0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
11cc0 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
11cd0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
11ce0 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
11cf0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
11d00 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
11d10 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
11d20 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
11d30 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
11d40 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
11d50 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
11d60 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
11d70 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
11d80 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
11d90 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
11da0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
11db0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
11dc0 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
11dd0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
11de0 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
11df0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
11e00 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
11e10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
11e20 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
11e30 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
11e40 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
11e50 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
11e60 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
11e70 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
11e80 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
11e90 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
11ea0 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
11eb0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
11ec0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
11ed0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
11ee0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
11ef0 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
11f00 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
11f10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11f20 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11f30 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
11f40 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
11f50 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
11f60 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
11f70 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
11f80 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
11f90 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
11fa0 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
11fb0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
11fc0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
11fd0 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
11fe0 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
11ff0 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
12000 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
12010 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
12020 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
12030 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
12040 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
12050 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
12060 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
12070 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
12080 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
12090 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
120a0 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
120b0 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
120c0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
120d0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
120e0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
120f0 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
12100 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
12110 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
12120 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
12130 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
12140 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
12150 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
12160 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
12170 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
12180 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
12190 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
121a0 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
121b0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
121c0 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
121d0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
121e0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
121f0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
12200 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
12210 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
12220 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
12230 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
12240 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
12250 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
12260 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
12270 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
12280 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
12290 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
122a0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
122b0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
122c0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
122d0 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
122e0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
122f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
12300 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
12310 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
12320 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
12330 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12340 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
12350 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
12360 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
12370 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
12380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12390 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
123a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
123b0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
123c0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
123d0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
123e0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
123f0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
12400 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
12410 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
12420 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
12430 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  er, pPg);.}../*.
12440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12450 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
12460 61 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68  ate the cache wh
12470 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  en a database.**
12480 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20   is truncated.  
12490 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61  Drop from the ca
124a0 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68  che all pages wh
124b0 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c  ose pgno is.** l
124c0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
124d0 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
124e0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
124f0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  *.** Referenced 
12500 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
12510 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
12520 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
12530 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20  ** Actually, at 
12540 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72  the point this r
12550 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12560 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  , it would be.**
12570 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76   an error to hav
12580 65 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70  e a referenced p
12590 61 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72  age.  But rather
125a0 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20   than delete.** 
125b0 74 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75  that page and gu
125c0 61 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71  arantee a subseq
125d0 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69  uent segfault, i
125e0 74 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a  t seems better.*
125f0 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64  * to zero it and
12600 20 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72   hope that we er
12610 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a  ror out sanely..
12620 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
12630 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
12640 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
12650 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
12660 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
12670 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
12680 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
12690 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
126a0 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
126b0 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
126c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
126d0 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
126e0 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
126f0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
12700 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
12710 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
12720 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
12730 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
12740 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
12750 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
12760 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
12770 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12780 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
12790 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
127a0 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
127b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
127c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
127d0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
127e0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
127f0 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
12800 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
12810 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43  Pg);.      makeC
12820 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20  lean(pPg);.     
12830 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
12840 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
12850 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
12860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
12870 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
12880 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
12890 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
128a0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
128b0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
128c0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
128d0 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
128e0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
128f0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
12900 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
12910 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
12920 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
12930 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
12940 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12950 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
12960 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
12970 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
12980 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
12990 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
129a0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
129b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
129c0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
129d0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
129e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
129f0 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
12a00 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
12a10 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
12a20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12a30 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
12a40 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
12a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
12a60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
12a70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
12a80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
12a90 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
12aa0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
12ab0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
12ac0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
12ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
12ae0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
12af0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
12b00 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
12b10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12b20 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
12b30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12b40 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
12b50 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
12b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
12b70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
12b80 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
12b90 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
12ba0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
12bb0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
12bc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12bd0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
12be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12bf0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12c00 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
12c10 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
12c20 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
12c30 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
12c40 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
12c50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12c60 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
12c70 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
12c80 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
12c90 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
12ca0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
12cb0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
12cc0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
12cd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
12ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
12cf0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
12d00 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71  || MEMDB );.  sq
12d10 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12d20 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
12d30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
12d40 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
12d50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
12d60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12d70 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
12d80 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
12d90 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
12da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12db0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
12dc0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
12dd0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
12de0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
12df0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
12e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
12e20 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
12e30 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
12e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e60 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
12e70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
12e80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
12e90 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
12ea0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
12eb0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
12ec0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
12ed0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
12ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12ef0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12f00 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
12f10 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
12f20 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72   nPage);.  retur
12f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12f40 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
12f50 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
12f60 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
12f70 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
12f80 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
12f90 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
12fa0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
12fb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12fc0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
12fd0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
12fe0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
12ff0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
13000 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
13010 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
13020 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
13030 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
13040 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
13050 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
13060 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
13070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
13080 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
13090 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
130a0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
130b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
130c0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
130d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
130e0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
130f0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
13100 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
13110 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13120 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
13130 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
13140 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
13150 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
13160 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
13170 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
13180 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
13190 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
131a0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
131b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
131c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131d0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
131e0 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
131f0 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
13200 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
13210 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
13220 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
13230 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
13240 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
13250 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
13260 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
13270 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
13280 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
13290 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
132a0 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
132b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
132c0 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
132d0 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
132e0 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
132f0 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
13300 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
13310 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
13320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
13340 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c  sd && pTsd->nAll
13350 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  oc );.#endif..  
13360 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
13370 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
13380 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13390 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
133a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
133b0 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
133c0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
133d0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
133e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
133f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
13400 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
13410 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
13420 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
13430 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
13440 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
13450 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
13460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
13470 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
13480 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
13490 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
134a0 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
134b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
134c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
134d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
134e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
134f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
13500 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
13510 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13520 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
13530 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
13540 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
13550 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
13560 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
13570 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
13580 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
13590 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
135a0 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
135b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
135c0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
135d0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
135e0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
135f0 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
13600 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
13610 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
13620 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
13630 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
13640 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
13650 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
13660 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
13670 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
13680 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
13690 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
136a0 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
136b0 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
136c0 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
136d0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
136e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
136f0 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
13700 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
13710 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
13720 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
13730 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  =pTmp->pNext){}.
13740 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
13750 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
13760 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
13770 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
13780 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
13790 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
137a0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
137b0 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
137c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137d0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
137e0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
137f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
13800 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
13810 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
13820 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
13830 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
13840 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
13850 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
13860 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
13870 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
13880 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
13890 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
138a0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
138b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
138c0 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
138d0 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
138e0 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
138f0 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
13900 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
13910 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
13920 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
13930 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
13940 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
13950 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
13960 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
13970 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
13980 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
13990 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
139a0 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
139b0 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
139c0 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
139d0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
139e0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
139f0 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
13a00 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
13a10 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
13a20 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
13a30 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
13a40 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
13a50 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
13a60 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
13a70 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
13a80 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
13a90 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
13aa0 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
13ab0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
13ac0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
13ad0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
13ae0 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
13af0 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
13b00 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
13b10 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
13b20 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
13b30 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
13b40 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
13b50 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
13b60 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
13b70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
13b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
13b90 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
13ba0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
13bb0 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
13bc0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
13bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
13be0 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
13bf0 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
13c00 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
13c10 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
13c20 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
13c30 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
13c40 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
13c50 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
13c60 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
13c70 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
13c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13c90 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
13ca0 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
13cb0 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
13cc0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
13cd0 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
13ce0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
13cf0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
13d00 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
13d10 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
13d20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13d30 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
13d40 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
13d50 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
13d60 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
13d70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
13d80 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
13d90 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
13da0 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
13db0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
13dc0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
13dd0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
13de0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
13df0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
13e00 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
13e10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13e20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13e30 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
13e40 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
13e50 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
13e60 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
13e70 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
13e80 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
13e90 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
13ea0 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
13eb0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
13ec0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
13ed0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
13ee0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13ef0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
13f00 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
13f10 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
13f20 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
13f30 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13f40 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
13f50 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
13f60 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
13f70 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
13f80 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
13f90 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
13fa0 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
13fb0 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
13fc0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
13fd0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
13fe0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13ff0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
14000 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
14010 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
14020 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14030 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
14040 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
14050 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
14060 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
14070 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
14080 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
14090 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
140a0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
140b0 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
140c0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
140d0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
140e0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
140f0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
14100 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
14110 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
14120 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
14130 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
14140 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
14150 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
14160 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
14170 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
14180 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
14190 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
141a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
141b0 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
141c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
141d0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
141e0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
141f0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
14200 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
14210 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
14220 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
14230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14240 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
14250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14260 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
14270 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
14280 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
14290 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
142a0 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
142b0 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
142c0 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
142d0 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
142e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
142f0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
14300 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
14310 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
14320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14330 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
14340 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
14350 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
14360 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
14370 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
14380 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
14390 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
143a0 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
143b0 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
143c0 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
143d0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
143e0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
143f0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14400 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
14410 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
14420 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
14430 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
14440 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
14450 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
14460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14470 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14480 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
14490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
144a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
144b0 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
144c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
144d0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
144e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
144f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14500 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
14510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
14520 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
14530 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
14540 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
14550 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
14560 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
14570 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
14580 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
14590 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
145a0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
145b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
145c0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
145d0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
145e0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
145f0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
14600 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
14610 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
14620 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
14630 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
14640 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
14660 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
14670 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
14680 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14690 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
146a0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
146b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
146c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
146d0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
146e0 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
146f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14700 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
14720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
14730 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
14760 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
14770 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
14780 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
14790 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
147a0 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  c;.        IOTRA
147b0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
147c0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
147d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
147e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
147f0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
14800 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34  JournalMagic), 4
14810 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
14820 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
14830 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14840 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
14850 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14860 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
14870 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
14880 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
14890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
148a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
148b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
148c0 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45      }.      PAGE
148d0 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
148e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
148f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
14900 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
14910 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
14920 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 72 63  Pager)).      rc
14930 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
14940 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
14950 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
14960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14970 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
14980 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14990 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
149a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
149b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
149c0 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
149d0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
149e0 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
149f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
14a00 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
14a10 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
14a20 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
14a30 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
14a40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14a50 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14a60 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
14a70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
14a80 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
14a90 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
14aa0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
14ab0 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
14ac0 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
14ad0 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
14ae0 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
14af0 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
14b00 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
14b10 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
14b20 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
14b30 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
14b40 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
14b50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
14b60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14b70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
14b80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
14b90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
14ba0 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
14bb0 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
14bc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
14bd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14be0 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20  Merge two lists 
14bf0 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  of pages connect
14c00 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64  ed by pDirty and
14c10 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a   in pgno order..
14c20 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66  ** Do not both f
14c30 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44  ixing the pPrevD
14c40 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a  irty pointers..*
14c50 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
14c60 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50  merge_pagelist(P
14c70 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20  gHdr *pA, PgHdr 
14c80 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65  *pB){.  PgHdr re
14c90 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20  sult, *pTail;.  
14ca0 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b  pTail = &result;
14cb0 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
14cc0 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
14cd0 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20  ->pgno<pB->pgno 
14ce0 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  ){.      pTail->
14cf0 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20  pDirty = pA;.   
14d00 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20     pTail = pA;. 
14d10 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44       pA = pA->pD
14d20 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
14d30 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
14d40 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20  irty = pB;.     
14d50 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20   pTail = pB;.   
14d60 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72     pB = pB->pDir
14d70 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ty;.    }.  }.  
14d80 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54  if( pA ){.    pT
14d90 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
14da0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
14db0 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
14dc0 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65  Dirty = pB;.  }e
14dd0 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  lse{.    pTail->
14de0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  pDirty = 0;.  }.
14df0 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e    return result.
14e00 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
14e10 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f   Sort the list o
14e20 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  f pages in accen
14e30 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67  ding order by pg
14e40 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a  no.  Pages are.*
14e50 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  * connected by p
14e60 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20  Dirty pointers. 
14e70 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20   The pPrevDirty 
14e80 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20  pointers are.** 
14e90 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69  corrupted by thi
14ea0 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69  s sort..*/.#defi
14eb0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
14ec0 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e  _ALLOC 25.#defin
14ed0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
14ee0 20 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20        25.#ifdef 
14ef0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
14f00 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
14f10 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20  n_sort_bucket = 
14f20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f  0;.  #undef N_SO
14f30 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66  RT_BUCKET.  #def
14f40 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
14f50 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f  T \.   (sqlite3_
14f60 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
14f70 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65  ket?sqlite3_page
14f80 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a  r_n_sort_bucket:
14f90 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
14fa0 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  LOC).#endif.stat
14fb0 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70  ic PgHdr *sort_p
14fc0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
14fd0 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b  In){.  PgHdr *a[
14fe0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
14ff0 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20  LOC], *p;.  int 
15000 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30  i;.  memset(a, 0
15010 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20  , sizeof(a));.  
15020 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20  while( pIn ){.  
15030 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70    p = pIn;.    p
15040 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  In = p->pDirty;.
15050 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
15060 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
15070 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  i<N_SORT_BUCKET-
15080 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
15090 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  f( a[i]==0 ){.  
150a0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a        a[i] = p;.
150b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
150c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
150d0 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
150e0 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
150f0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
15100 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15110 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f  .    if( i==N_SO
15120 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20  RT_BUCKET-1 ){. 
15130 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
15140 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74  : To get here, t
15150 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20  here need to be 
15160 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  2^(N_SORT_BUCKET
15170 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  ) .      ** elem
15180 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
15190 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  t list. This is 
151a0 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d  possible, but im
151b0 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20  practical..     
151c0 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73   ** Testing this
151d0 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69   line is the poi
151e0 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72  nt of global var
151f0 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73  iable.      ** s
15200 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
15210 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20  ort_bucket..    
15220 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20    */.      a[i] 
15230 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
15240 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d  (a[i], p);.    }
15250 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b  .  }.  p = a[0];
15260 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f  .  for(i=1; i<N_
15270 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b  SORT_BUCKET; i++
15280 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65  ){.    p = merge
15290 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69  _pagelist(p, a[i
152a0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
152b0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
152c0 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
152d0 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
152e0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
152f0 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
15300 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
15310 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
15320 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15330 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
15340 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
15350 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
15360 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
15370 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
15380 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
15390 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
153a0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
153b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
153c0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
153d0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
153e0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
153f0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
15400 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
15410 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
15420 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
15430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15440 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
15450 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
15460 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
15470 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
15480 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
15490 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
154a0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
154b0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
154c0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
154d0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
154e0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
154f0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
15500 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
15510 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
15520 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
15530 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
15540 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
15550 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
15560 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
15570 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
15580 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
15590 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
155a0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
155b0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
155c0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
155d0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
155e0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
155f0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
15600 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
15610 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
15620 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
15630 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
15640 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
15650 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
15660 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
15670 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
15680 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
15690 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
156a0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
156b0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
156c0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
156d0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
156e0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
156f0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
15700 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
15710 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
15720 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
15730 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
15740 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
15750 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
15760 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
15770 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
15780 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
15790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
157b0 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
157c0 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
157d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
157e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
157f0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
15800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15810 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
15820 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d  d, (pList->pgno-
15830 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15840 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
15850 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15860 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  c;.    /* If the
15870 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
15880 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
15890 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
158a0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
158b0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
158c0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
158d0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
158e0 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
158f0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
15900 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
15910 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
15920 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
15930 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
15940 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
15950 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
15960 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
15970 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
15980 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
15990 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ze ){.      char
159a0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
159b0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
159c0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
159d0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
159e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
159f0 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
15a00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
15a10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15a20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
15a30 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
15a40 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
15a50 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
15a60 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
15a70 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
15a80 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
15a90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15aa0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
15ab0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
15ac0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15ad0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
15ae0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
15af0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
15b00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
15b10 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
15b20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
15b30 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
15b40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15b50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
15b60 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
15b70 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
15b80 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
15b90 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
15ba0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
15bb0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
15bc0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
15bd0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
15be0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15bf0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
15c00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15c10 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15c20 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
15c30 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
15c40 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
15c50 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
15c60 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
15c70 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
15c80 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
15c90 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
15ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15cc0 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
15cd0 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
15ce0 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
15cf0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
15d00 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
15d10 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
15d20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
15d30 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
15d40 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
15d50 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
15d60 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
15d70 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
15d80 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
15d90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
15da0 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a  ager->pDirty;.}.
15db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
15dc0 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61  UE if there is a
15dd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
15de0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
15df0 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
15e00 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
15e10 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
15e20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15e30 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
15e40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15e50 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
15e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
15e70 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
15e80 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
15e90 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
15ea0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
15eb0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
15ec0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
15ed0 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
15ee0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
15ef0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
15f00 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
15f10 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
15f20 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
15f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
15f40 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  ( !sqlite3OsFile
15f50 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
15f60 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
15f70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15f80 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65  if( sqlite3OsChe
15f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
15fa0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
15fb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
15fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15fe0 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
15ff0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
16000 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
16010 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
16030 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
16040 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
16050 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
16060 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
16070 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
16080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
16090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
160a0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
160b0 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
160c0 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
160d0 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
160e0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
160f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16100 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
16110 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16120 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
16130 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
16140 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
16150 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45  0;..  assert(!ME
16160 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  MDB);..  /* Find
16170 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
16180 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
16190 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
161a0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
161b0 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
161c0 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
161d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
161e0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
161f0 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f  irstSynced;..  /
16200 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
16210 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
16220 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
16230 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
16240 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
16250 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
16260 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
16270 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
16280 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
16290 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
162a0 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
162b0 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
162c0 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61  times.  ** it ca
162d0 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
162e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30   */.  if( pPg==0
162f0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
16300 73 74 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  st && pPager->nR
16310 65 63 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20  ec && syncOk && 
16320 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74  !MEMDB){.    int
16330 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
16340 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
16350 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
16360 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16370 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16380 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
16390 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
163a0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
163b0 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
163c0 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
163d0 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  e.      ** journ
163e0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  al file. This is
163f0 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65   done to avoid e
16400 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ver modifying a 
16410 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
16420 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20   header that is 
16430 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
16440 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65  rollback of page
16450 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
16460 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
16470 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
16480 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
16490 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
164a0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65  .      ** trashe
164b0 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20  d when the nRec 
164c0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
164d0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
164e0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
164f0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
16500 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
16510 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
16520 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16530 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
16540 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
16550 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
16560 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
16570 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
16580 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16590 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
165a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
165b0 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  st;.  }.  if( pP
165c0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
165d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
165e0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
165f0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
16600 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
16610 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
16620 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
16630 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
16640 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
16650 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
16660 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
16670 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
16680 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
16690 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
166a0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
166b0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
166c0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
166d0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
166e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
166f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
16700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16710 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16720 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
16730 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
16740 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
16750 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
16760 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
16770 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
16780 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
16790 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
167a0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
167b0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
167c0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
167d0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
167e0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
167f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
16800 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
16810 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
16820 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
16830 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
16840 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
16850 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
16860 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
16870 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
16880 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
16890 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
168a0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
168b0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
168c0 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
168d0 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
168e0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
168f0 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
16900 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
16910 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
16920 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
16930 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
16940 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
16950 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
16960 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
16970 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
16980 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
16990 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
169a0 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
169b0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
169c0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
169d0 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
169e0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
169f0 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
16a00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16a10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
16a20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16a30 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
16a40 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
16a50 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
16a60 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
16a70 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
16a80 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
16a90 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
16aa0 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
16ab0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
16ac0 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
16ad0 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
16ae0 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
16af0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16b00 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
16b10 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
16b20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
16b30 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
16b40 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
16b50 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
16b60 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
16b70 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
16b80 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
16b90 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
16ba0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
16bb0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
16bc0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
16bd0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
16be0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
16bf0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
16c00 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
16c10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16c20 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73  IT_DISKIO).int s
16c30 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61  qlite3PagerRelea
16c40 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65  seMemory(int nRe
16c50 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  q){.  const Thre
16c60 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d  adData *pTsdro =
16c70 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
16c80 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
16c90 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
16ca0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
16cb0 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f  * If the the glo
16cc0 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c  bal mutex is hel
16cd0 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  d, this subrouti
16ce0 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a  ne becomes a.  *
16cf0 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74  * o-op; zero byt
16d00 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  es of memory are
16d10 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73   freed.  This is
16d20 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f   because.  ** so
16d30 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
16d40 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
16d50 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
16d60 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
16d70 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72  ain the mutex, r
16d80 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65  esulting in a de
16d90 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  adlock..  */.  i
16da0 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  f( sqlite3OsInMu
16db0 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65  tex(0) ){.    re
16dc0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
16dd0 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
16de0 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
16df0 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
16e00 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
16e10 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
16e20 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
16e30 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
16e40 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
16e50 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
16e60 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
16e70 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
16e80 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
16e90 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
16ea0 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
16eb0 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
16ec0 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
16ed0 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
16ee0 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
16ef0 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
16f00 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
16f10 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
16f20 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
16f30 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
16f40 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
16f50 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
16f60 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
16f70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16f80 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a  pTsdro->pPager;.
16f90 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65      for( ; pPage
16fa0 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20  r && (nReq<0 || 
16fb0 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b  nReleased<nReq);
16fc0 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
16fd0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67  pNext){.      Pg
16fe0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
16ff0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69  int rc;..      i
17000 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17010 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17020 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17030 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
17040 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
17050 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
17060 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
17070 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
17080 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
17090 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
170a0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
170b0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
170c0 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
170d0 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
170e0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
170f0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
17100 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
17110 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
17120 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
17130 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
17140 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
17150 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
17160 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
17170 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
17180 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
17190 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
171a0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
171b0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
171c0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
171d0 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
171e0 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
171f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
17200 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
17210 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
17220 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
17230 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
17240 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
17250 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
17260 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
17270 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
17280 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
17290 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
172a0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
172b0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
172c0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
172d0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
172e0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
172f0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17300 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
17310 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
17320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17330 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67    for( pTmp=pPag
17340 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  er->pAll; pTmp->
17350 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
17360 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
17370 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
17380 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
17390 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
173a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
173b0 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
173c0 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
173d0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  pPg);.        IO
173e0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
173f0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
17400 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
17410 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
17420 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
17430 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
17440 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
17450 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
17460 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17480 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
17490 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
174a0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
174b0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
174c0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
174d0 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
174e0 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
174f0 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
17500 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
17510 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
17520 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
17530 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
17540 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
17550 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
17560 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
17570 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
17580 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
17590 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
175a0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
175b0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
175c0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
175d0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
175e0 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
175f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17600 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66  assert( (rc&0xff
17610 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
17620 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
17630 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
17640 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17650 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
17660 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
17670 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17680 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
17690 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
176a0 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
176b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
176c0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
176d0 4d 41 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53  MANAGEMENT && !S
176e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
176f0 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  O */../*.** Read
17700 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
17710 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
17720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17730 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17740 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
17750 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
17760 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
17770 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
17780 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
17790 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
177a0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
177b0 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
177c0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177d0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
177e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
177f0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
17800 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
17810 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17820 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
17840 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17850 20 20 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52    }.  PAGER_INCR
17860 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
17870 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
17880 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
17890 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
178a0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
178b0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
178c0 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  no));.  if( pgno
178d0 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
178e0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
178f0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
17900 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17910 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17940 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
17950 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
17960 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
17970 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
17980 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
17990 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45  pgno, 3);.  PAGE
179a0 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25  RTRACE4("FETCH %
179b0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
179c0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
179d0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
179e0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
179f0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
17a00 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75  sh(pPg));.  retu
17a10 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
17a20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17a30 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
17a40 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
17a50 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
17a60 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
17a70 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
17a80 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
17a90 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17aa0 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
17ab0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
17ac0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
17ad0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
17ae0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
17af0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
17b00 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
17b10 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
17b20 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
17b30 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
17b40 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
17b50 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
17b60 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
17b70 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
17b80 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
17b90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17ba0 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
17bb0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17bc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17bd0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
17be0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17bf0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
17c00 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
17c10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
17c20 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
17c30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
17c40 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
17c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
17c60 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
17c70 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
17c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17ca0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
17cb0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17cc0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17cd0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
17ce0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17cf0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17d00 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
17d10 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
17d20 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
17d30 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
17d40 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
17d50 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
17d60 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
17d70 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
17d80 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
17d90 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
17da0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17db0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
17dc0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
17dd0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
17de0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
17df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17e00 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
17e10 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
17e20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
17e30 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
17e40 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
17e50 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
17e60 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
17e70 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
17e80 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
17e90 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
17ea0 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
17eb0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
17ec0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
17ed0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
17ee0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
17ef0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17f00 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
17f10 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
17f20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
17f30 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
17f40 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
17f50 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
17f60 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
17f70 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
17f80 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
17f90 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
17fa0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
17fb0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
17fc0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
17fd0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
17fe0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
17ff0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
18000 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
18010 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18020 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
18030 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
18040 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
18050 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
18060 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
18070 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18090 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
180a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
180b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
180c0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
180d0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
180e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
180f0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
18100 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
18110 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
18120 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
18130 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
18140 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
18150 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
18160 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
18170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18180 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
18190 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
181a0 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
181b0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
181c0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
181d0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
181e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
181f0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
18200 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18210 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
18220 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
18230 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
18240 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
18250 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
18260 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
18270 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
18280 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
18290 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
182a0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
182b0 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
182c0 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74  al for read/writ
182d0 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20 69  e access. This i
182e0 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20  s because in .  
182f0 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73 69        ** exclusi
18300 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
18310 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18320 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
18330 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
18340 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
18350 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
18360 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
18370 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
18380 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
18390 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
183a0 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
183b0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
183c0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
183d0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
183e0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
183f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18410 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
18420 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
18430 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
18440 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
18450 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
18460 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
18470 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18480 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
18490 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
184a0 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
184b0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
184c0 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
184d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
184e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
184f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
18500 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
18510 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
18520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18530 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
18540 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
18550 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
18560 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18570 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18580 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18590 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
185a0 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
185b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
185c0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
185d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
185e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
185f0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
18600 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
18610 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
18620 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
18630 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
18640 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
18650 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
18660 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
18670 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
18680 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
18690 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
186a0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
186b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
186c0 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
186d0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
186e0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
186f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
18700 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
18710 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
18720 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
18730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18740 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18750 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
18760 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
18770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
18780 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
18790 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
187a0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
187b0 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
187c0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
187d0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
187e0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
187f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
18800 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
18810 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
18820 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
18830 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
18840 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
18850 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
18860 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
18870 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
18880 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
18890 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
188a0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
188b0 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
188c0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
188d0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
188e0 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
188f0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
18900 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
18910 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
18920 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
18930 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
18940 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
18950 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
18960 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
18970 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
18980 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
18990 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
189a0 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
189b0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
189c0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
189d0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
189e0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
189f0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
18a00 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
18a10 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
18a20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
18a30 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
18a40 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
18a50 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
18a60 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
18a70 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
18a80 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
18a90 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
18aa0 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
18ab0 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
18ac0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
18ad0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
18ae0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
18af0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
18b00 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
18b10 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
18b20 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
18b30 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
18b40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18b50 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
18b60 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
18b70 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
18b80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18b90 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
18ba0 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
18bb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18bc0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
18bd0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18be0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
18bf0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
18c00 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18c10 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
18c20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
18c30 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
18c40 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
18c50 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
18c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18c70 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
18c80 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
18c90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18ca0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18cb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18cd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18ce0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18cf0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
18d00 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
18d10 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
18d20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18d30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
18d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18d50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
18d60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
18d70 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
18d80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
18d90 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
18da0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
18db0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
18dc0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
18dd0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
18de0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
18df0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
18e00 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
18e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18e20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
18e30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
18e40 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
18e50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
18e60 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
18e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18e80 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18e90 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18ea0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18eb0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
18ec0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
18ee0 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
18ef0 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
18f00 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
18f10 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
18f20 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
18f30 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
18f40 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
18f50 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
18f60 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
18f70 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
18f80 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
18f90 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
18fa0 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
18fb0 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
18fc0 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
18fd0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
18fe0 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
18ff0 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
19000 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
19010 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
19020 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
19030 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
19040 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
19050 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
19060 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
19070 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
19080 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
19090 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
190a0 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
190b0 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
190c0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
190d0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
190e0 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
190f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19100 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
19110 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
19120 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
19130 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
19140 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
19150 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19160 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
19170 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
19180 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
19190 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
191a0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
191b0 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
191c0 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
191d0 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
191e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
191f0 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
19200 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
19210 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
19220 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
19230 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
19240 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
19250 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
19260 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
19270 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
19280 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
19290 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
192a0 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
192b0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
192c0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
192d0 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
192e0 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
192f0 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
19300 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
19310 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
19320 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
19330 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
19340 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
19350 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
19360 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19370 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
19380 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
19390 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
193a0 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
193b0 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
193c0 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20  * above is met: 
193d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
193e0 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
193f0 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
19400 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20  er->pFirst==0 . 
19410 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
19420 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74   (pPager->pFirst
19430 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
19440 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
19450 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
19460 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
19470 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
19480 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
19490 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
194a0 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
194b0 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
194c0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
194d0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
194e0 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
194f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
19500 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
19510 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19520 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
19530 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19540 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
19550 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
19560 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
19570 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19590 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
195a0 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
195b0 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
195e0 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
195f0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
19600 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
19610 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
19620 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
19630 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
19640 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
19650 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
19660 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
19670 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
19680 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
19690 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
196a0 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
196b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
196c0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
196d0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
196e0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
196f0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
19700 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
19710 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
19720 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19730 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
19740 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
19750 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
19760 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
19770 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
19780 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
19790 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
197a0 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
197b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
197c0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
197d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
197e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
197f0 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
19800 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
19810 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19820 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
19830 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
19840 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
19850 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
19860 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
19870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19880 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19890 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
198a0 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
198b0 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
198c0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
198d0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
198e0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
198f0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
19900 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
19910 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
19920 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
19930 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
19940 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
19950 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
19960 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
19970 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
19980 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
19990 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
199a0 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
199b0 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
199c0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
199d0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
199e0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
199f0 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
19a00 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
19a10 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
19a20 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
19a50 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
19a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19a80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19a90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19aa0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
19ab0 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
19ac0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
19ad0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
19ae0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
19af0 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
19b00 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
19b10 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
19b20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
19b30 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
19b40 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19b50 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
19b60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
19b70 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
19b80 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
19b90 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
19ba0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
19bb0 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
19bc0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
19bd0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
19be0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
19bf0 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
19c00 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
19c10 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
19c20 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
19c30 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
19c40 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
19c50 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
19c60 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
19c70 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
19c80 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
19c90 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
19ca0 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
19cb0 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
19cc0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
19cd0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
19ce0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
19cf0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
19d00 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
19d10 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
19d20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
19d30 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
19d40 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
19d50 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
19d60 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
19d70 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
19d80 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
19d90 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
19da0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
19db0 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
19dc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
19dd0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
19de0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
19df0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
19e00 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
19e10 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
19e20 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
19e30 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
19e40 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
19e50 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
19e60 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
19e70 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
19e80 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
19e90 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
19ea0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
19eb0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
19ec0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
19ed0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
19ee0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
19ef0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
19f00 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
19f10 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
19f20 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
19f30 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
19f40 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
19f50 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
19f60 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
19f70 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
19f80 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
19f90 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
19fa0 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
19fb0 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
19fc0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
19fd0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
19fe0 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
19ff0 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1a000 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1a010 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1a020 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1a030 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1a040 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1a050 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a060 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1a070 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1a080 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a090 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1a0a0 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1a0b0 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1a0c0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1a0d0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1a0e0 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1a0f0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1a100 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
1a110 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
1a120 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1a130 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1a140 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1a150 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a160 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1a170 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1a180 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1a190 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1a1a0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1a1b0 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1a1c0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1a1d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1a1e0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1a1f0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1a200 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1a210 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1a220 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1a230 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1a240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1a250 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1a260 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1a270 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1a280 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1a290 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1a2a0 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1a2b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1a2c0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1a2d0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1a2e0 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1a2f0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1a300 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1a310 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1a320 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1a330 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1a340 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1a350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a360 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1a370 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1a380 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1a390 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1a3a0 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1a3b0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1a3c0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1a3d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1a3e0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1a3f0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1a400 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1a410 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1a420 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
1a430 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1a440 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
1a450 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
1a460 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
1a470 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a480 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
1a490 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
1a4a0 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
1a4b0 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
1a4c0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
1a4d0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
1a4e0 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
1a4f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a500 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1a510 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1a520 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a530 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1a540 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
1a550 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1a560 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1a570 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
1a580 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1a590 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
1a5a0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1a5b0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
1a5c0 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
1a5d0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1a5e0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
1a5f0 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
1a600 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
1a610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a640 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
1a650 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
1a660 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
1a670 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
1a680 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
1a690 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a6a0 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
1a6b0 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1a6c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
1a6d0 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
1a6e0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1a6f0 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
1a700 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a710 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a720 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1a730 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
1a740 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1a750 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
1a760 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
1a770 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1a780 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a790 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1a7a0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1a7b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
1a7c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
1a7d0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1a7e0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
1a7f0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
1a800 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
1a810 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
1a820 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
1a830 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1a840 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
1a850 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
1a860 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1a870 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
1a880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1a890 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1a8a0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a8b0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1a8c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1a8d0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1a8e0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1a8f0 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75  Code;.      retu
1a900 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1a910 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1a920 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
1a930 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
1a940 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1a950 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
1a960 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
1a970 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
1a980 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
1a990 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1a9a0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1a9b0 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
1a9c0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
1a9d0 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
1a9e0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1a9f0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1aa00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1aa10 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1aa20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1aa30 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1aa40 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
1aa50 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1aa60 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
1aa70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1aa80 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1aa90 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
1aaa0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1aab0 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
1aac0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
1aad0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1aae0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
1aaf0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1ab00 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
1ab10 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
1ab20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ab30 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1ab40 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1ab50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
1ab60 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
1ab70 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ab80 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1ab90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1aba0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1abb0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1abc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
1abd0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
1abe0 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
1abf0 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
1ac00 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
1ac10 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
1ac20 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
1ac30 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1ac40 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1ac50 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
1ac60 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1ac70 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
1ac80 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
1ac90 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1aca0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1acb0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
1acc0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1acd0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
1ace0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1acf0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1ad00 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
1ad10 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1ad20 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1ad30 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1ad40 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1ad50 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
1ad60 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1ad70 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1ad80 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1ad90 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
1ada0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
1adb0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
1adc0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
1add0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1ade0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
1adf0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ae00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ae10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ae20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1ae30 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
1ae40 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1ae50 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1ae60 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1ae70 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1ae80 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1ae90 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1aea0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1aeb0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1aec0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1aed0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1aee0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1aef0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1af00 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1af10 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1af20 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1af30 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1af40 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1af50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1af60 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
1af70 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
1af80 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
1af90 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1afa0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1afb0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1afc0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1afd0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1afe0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1aff0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1b000 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1b010 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1b020 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1b030 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1b040 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1b050 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1b060 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1b070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b080 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1b090 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1b0a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b0b0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1b0c0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b0d0 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
1b0e0 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
1b0f0 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72  iveMode );.    r
1b100 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1b110 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1b120 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1b130 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1b140 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
1b150 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
1b160 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1b170 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1b180 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
1b190 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
1b1a0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
1b1b0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1b1c0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1b1d0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1b1e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1b1f0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1b200 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1b210 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1b220 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1b230 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1b240 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1b250 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1b260 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1b270 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1b280 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b290 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1b2a0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1b2b0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1b2c0 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1b2d0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1b2e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1b2f0 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1b300 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1b310 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
1b320 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
1b330 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
1b340 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1b350 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
1b360 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1b370 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
1b380 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
1b390 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
1b3a0 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
1b3b0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1b3c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1b3d0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1b3e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1b3f0 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1b400 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1b410 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
1b420 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
1b430 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
1b440 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
1b450 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
1b460 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1b470 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
1b480 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
1b490 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
1b4a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b4b0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
1b4c0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1b4d0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1b4e0 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
1b4f0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1b500 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1b510 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
1b520 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1b530 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1b540 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1b550 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1b560 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1b570 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b580 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1b590 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1b5a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1b5b0 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1b5c0 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1b5d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b5e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1b5f0 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1b600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b610 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1b620 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1b630 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1b640 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1b650 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b660 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1b670 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1b680 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1b690 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b6a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b6b0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1b6c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1b6d0 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1b6e0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1b6f0 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1b700 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1b710 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b720 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1b730 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1b740 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1b750 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1b760 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1b770 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1b780 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1b790 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1b7a0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1b7b0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1b7c0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1b7d0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1b7e0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1b7f0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1b800 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1b810 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1b820 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1b830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b840 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1b850 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b860 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1b870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b880 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b890 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1b8a0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1b8b0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1b8c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1b8d0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1b8e0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1b8f0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1b900 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1b910 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1b920 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1b930 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1b940 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1b950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b960 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
1b970 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1b980 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b9b0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1b9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1b9d0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1b9e0 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50  ger->jfd );.  pP
1b9f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ba00 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1ba10 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1ba20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ba30 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1ba40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ba50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ba60 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1ba70 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1ba80 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1ba90 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
1baa0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1bab0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1bac0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1bad0 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
1bae0 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1baf0 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1bb00 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1bb10 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1bb20 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1bb30 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
1bb40 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
1bb50 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
1bb60 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
1bb70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1bb80 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1bb90 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1bba0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1bbb0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1bbc0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1bbd0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
1bbe0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1bbf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1bc00 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
1bc10 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1bc20 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1bc30 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1bc40 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1bc50 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1bc60 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
1bc70 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1bc80 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
1bc90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bca0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
1bcb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bcc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bcd0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
1bce0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bcf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1bd00 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
1bd10 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
1bd20 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1bd30 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
1bd40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bd50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1bd60 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1bd70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bd80 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1bd90 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1bda0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1bdb0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1bdc0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1bdd0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1bde0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bdf0 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1be00 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1be10 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1be20 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1be30 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1be40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1be50 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1be60 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1be70 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1be80 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1be90 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1bea0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1beb0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1bec0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1bed0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1bee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1bef0 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1bf00 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1bf10 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1bf20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1bf30 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1bf40 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1bf50 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1bf60 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1bf70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1bf80 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1bf90 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1bfa0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1bfb0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1bfc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1bfd0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1bfe0 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1bff0 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1c000 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1c010 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1c020 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1c030 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1c040 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1c050 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1c060 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1c070 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1c080 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1c090 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1c0a0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1c0b0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1c0c0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1c0d0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1c0e0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1c0f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1c100 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1c110 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1c120 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1c130 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1c140 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1c150 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1c160 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1c170 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1c180 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1c190 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1c1a0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1c1b0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1c1c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1c1d0 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1c1e0 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1c1f0 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1c200 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1c210 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1c220 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1c230 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1c240 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1c250 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1c260 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1c270 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1c280 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1c290 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1c2a0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1c2b0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1c2c0 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1c2d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1c2e0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1c2f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c300 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1c310 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1c320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1c330 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1c340 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c350 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1c360 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1c370 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1c380 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
1c390 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1c3a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1c3b0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1c3c0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c3d0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1c3e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1c3f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c400 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1c410 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1c420 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1c430 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c450 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1c460 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
1c470 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
1c480 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
1c490 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1c4a0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1c4b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1c4c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c4d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1c4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c4f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c510 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1c520 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1c530 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1c540 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1c550 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c560 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c570 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1c580 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c590 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c5a0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1c5b0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1c5c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c5d0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1c5e0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c5f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c600 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1c610 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1c620 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1c630 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1c640 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1c650 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1c660 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1c670 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1c680 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1c690 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1c6a0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1c6b0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1c6c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c6d0 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1c6e0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1c6f0 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1c700 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1c710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c720 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1c730 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1c740 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1c750 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c760 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1c770 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1c780 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1c790 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1c7a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1c7b0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1c7c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1c7d0 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1 );.    if( !p
1c7e0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c7f0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1c800 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c820 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c830 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1c840 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1c850 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1c860 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1c870 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1c880 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c890 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1c8a0 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1c8b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1c8c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c8d0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
1c8e0 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
1c8f0 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
1c900 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
1c910 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
1c920 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1c930 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
1c940 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1c950 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
1c960 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c970 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c980 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1c990 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
1c9a0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
1c9b0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
1c9c0 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
1c9d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1c9e0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1c9f0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1ca00 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1ca10 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ca20 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
1ca30 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1ca40 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
1ca50 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
1ca60 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
1ca70 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
1ca80 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
1ca90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1caa0 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
1cab0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1cac0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1cad0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1cae0 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1caf0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1cb00 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1cb10 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1cb20 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1cb30 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1cb40 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1cb50 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1cb60 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1cb70 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1cb80 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1cb90 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1cba0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1cbb0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1cbc0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1cbd0 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1cbe0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1cbf0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1cc00 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1cc10 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1cc20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1cc30 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1cc40 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1cc50 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1cc60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1cc70 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1cc80 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1cc90 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1cca0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1ccb0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1ccc0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1ccd0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1cce0 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1ccf0 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1cd00 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1cd10 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1cd20 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1cd30 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1cd40 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1cd50 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1cd60 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1cd70 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1cd80 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1cd90 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1cda0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1cdb0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1cdc0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1cdd0 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1cde0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1cdf0 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1ce00 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1ce10 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ce20 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1ce30 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1ce40 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1ce50 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1ce60 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1ce70 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1ce80 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1ce90 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1cea0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1ceb0 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1cec0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1ced0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1cee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1cef0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1cf00 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1cf10 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1cf20 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1cf30 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cf40 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1cf50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1cf60 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1cf70 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1cf80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1cf90 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1cfa0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1cfb0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1cfc0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1cfd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1cfe0 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1cff0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d000 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1d010 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1d020 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d030 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1d040 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1d050 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1d060 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1d070 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1d080 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1d090 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1d0a0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1d0b0 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1d0c0 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1d0d0 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1d0e0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1d0f0 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1d100 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1d110 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1d120 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1d130 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1d140 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1d150 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1d160 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1d170 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1d180 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1d190 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1d1a0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1d1b0 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1d1c0 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1d1d0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1d1e0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1d1f0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d210 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1d220 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1d230 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1d240 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1d250 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1d260 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1d270 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1d280 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1d290 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1d2a0 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1d2b0 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
1d2c0 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
1d2d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d2e0 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1d2f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1d300 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1d310 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1d320 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1d330 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1d340 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1d350 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1d360 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1d370 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1d380 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1d390 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1d3a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1d3b0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1d3c0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1d3d0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1d3e0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1d3f0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1d400 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1d410 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1d420 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1d430 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1d440 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d450 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1d460 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d470 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d480 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d490 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d4a0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d4b0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1d4c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1d4d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1d4e0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1d4f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d500 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1d510 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1d520 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d530 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1d540 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d550 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d560 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1d570 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1d580 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1d590 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1d5a0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1d5b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1d5c0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1d5d0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1d5e0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1d5f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1d600 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d610 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1d620 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1d630 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1d640 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1d650 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1d660 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1d670 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1d680 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1d690 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1d6a0 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1d6b0 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1d6c0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1d6d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1d6e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1d6f0 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1d700 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1d710 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1d720 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1d730 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1d740 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1d750 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1d760 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1d770 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d780 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d7a0 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1d7b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1d7c0 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1d7d0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1d7e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1d7f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1d800 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1d810 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d820 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1d830 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1d840 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1d850 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1d860 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1d870 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1d880 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1d890 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1d8a0 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1d8b0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1d8c0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1d8d0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1d8e0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1d8f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1d900 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1d910 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1d920 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1d930 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1d940 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1d950 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1d960 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1d970 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1d980 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1d990 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1d9a0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1d9b0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1d9c0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1d9d0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1d9e0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1d9f0 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1da00 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1da10 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1da20 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1da30 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1da40 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1da50 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1da60 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1da70 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1da80 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1da90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1daa0 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1dab0 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1dac0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1dad0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1dae0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1daf0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1db00 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1db10 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1db20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1db30 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1db40 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1db50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1db60 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1db70 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1db80 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1db90 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1dba0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1dbb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1dbc0 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1dbd0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1dbe0 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
1dbf0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1dc00 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1dc10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1dc30 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1dc40 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72  >needSync, pager
1dc50 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1dc60 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1dc70 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1dc80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
1dc90 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1dca0 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
1dcb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1dcc0 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  The .          *
1dcd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1dce0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1dcf0 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1dd00 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  bove..          
1dd10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1dd20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1dd30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1dd40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1dd50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1dd60 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
1dd70 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1dd80 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1dd90 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1dda0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1ddb0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1ddc0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1ddd0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1dde0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1ddf0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
1de00 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
1de10 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1de20 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
1de30 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1de40 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1de50 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1de60 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1de70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1de80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1de90 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1dea0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1deb0 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61  lStarted && !pPa
1dec0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20  ger->noSync;.   
1ded0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34       PAGERTRACE4
1dee0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
1def0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
1df00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1df10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1df20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1df30 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
1df40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1df50 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1df60 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1df70 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1df80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1df90 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1dfa0 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
1dfb0 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
1dfc0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
1dfd0 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
1dfe0 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
1dff0 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
1e000 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1e010 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
1e020 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
1e030 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
1e040 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1e050 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
1e060 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
1e070 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
1e080 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
1e090 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
1e0a0 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
1e0b0 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
1e0c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1e0d0 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20  >stmtInUse .    
1e0e0 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1e0f0 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20  ment(pPg) .     
1e100 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1e110 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1e120 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize .    ){.    
1e130 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1e140 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
1e150 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
1e160 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
1e170 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42  .      if( MEMDB
1e180 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69   ){.        PgHi
1e190 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1e1a0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1e1b0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1e1c0 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1e1d0 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ->pStmt==0 );.  
1e1e0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1e1f0 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  mt = sqliteMallo
1e200 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
1e210 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
1e220 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
1e230 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
1e240 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
1e250 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
1e260 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
1e270 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1e280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
1e290 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1e2a0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1e2b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1e2c0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1e2d0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
1e2e0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
1e2f0 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
1e300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
1e310 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1e320 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1e330 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d  , pPg->pgno, 7)-
1e340 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  4;.        put32
1e350 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1e360 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1e370 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1e380 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
1e390 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1e3a0 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
1e3b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1e3c0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1e3d0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1e3e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e3f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1e400 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e420 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e440 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1e450 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1e460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1e470 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1e480 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1e490 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1e4a0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1e4b0 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1e4c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70    }.  }..  /* Up
1e4d0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  date the databas
1e4e0 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72  e size and retur
1e4f0 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  n..  */.  assert
1e500 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1e510 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
1e520 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
1e530 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e  bSize<(int)pPg->
1e540 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  pgno ){.    pPag
1e550 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67  er->dbSize = pPg
1e560 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  ->pgno;.    if( 
1e570 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1e580 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e  ->dbSize==PENDIN
1e590 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
1e5a0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
1e5b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b   pPager->dbSize+
1e5c0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  +;.    }.  }.  r
1e5d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e5e0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e5f0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b   is used to mark
1e600 20 61 20 64 61 74 61 2d 70 61 67 65 20 61 73 20   a data-page as 
1e610 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65  writable. It use
1e620 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74  s .** pager_writ
1e630 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f  e() to open a jo
1e640 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69  urnal file (if i
1e650 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
1e660 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72   open).** and wr
1e670 69 74 65 20 74 68 65 20 70 61 67 65 20 2a 70 44  ite the page *pD
1e680 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ata to the journ
1e690 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  al..**.** The di
1e6a0 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
1e6b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1e6c0 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  nd pager_write()
1e6d0 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
1e6e0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64   function also d
1e6f0 65 61 6c 73 20 77 69 74 68 20 74 68 65 20 73 70  eals with the sp
1e700 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
1e710 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73   2 or more pages
1e720 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e  .** fit on a sin
1e730 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  gle disk sector.
1e740 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
1e750 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61  l co-resident pa
1e760 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65  ges.** must have
1e770 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1e780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1e790 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1e7a0 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1e7b0 65 33 50 61 67 65 72 57 72 69 74 65 28 44 62 50  e3PagerWrite(DbP
1e7c0 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1e7d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e7e0 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70  _OK;..  PgHdr *p
1e7f0 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1e800 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e810 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50  pPg->pPager;.  P
1e820 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74  gno nPagePerSect
1e830 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65  or = (pPager->se
1e840 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d  ctorSize/pPager-
1e850 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69  >pageSize);..  i
1e860 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61  f( !MEMDB && nPa
1e870 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b  gePerSector>1 ){
1e880 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43  .    Pgno nPageC
1e890 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f  ount;          /
1e8a0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
1e8b0 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62  f pages in datab
1e8c0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
1e8d0 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20  Pgno pg1;       
1e8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1e8f0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1e900 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1e910 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ated on. */.    
1e920 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
1e930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1e940 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61  ber of pages sta
1e950 72 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20  rting at pg1 to 
1e960 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69  journal */.    i
1e970 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53  nt ii;..    /* S
1e980 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
1e990 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
1e9a0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
1e9b0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
1e9c0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
1e9d0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
1e9e0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
1e9f0 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
1ea00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1ea10 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1ea20 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1ea30 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Sync==0 );.    p
1ea40 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1ea50 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   = 1;..    /* Th
1ea60 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73  is trick assumes
1ea70 20 74 68 61 74 20 62 6f 74 68 20 74 68 65 20 70   that both the p
1ea80 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
1ea90 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20  tor-size are.   
1eaa0 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70   ** an integer p
1eab0 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65  ower of 2. It se
1eac0 74 73 20 76 61 72 69 61 62 6c 65 20 70 67 31 20  ts variable pg1 
1ead0 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66 69 65  to the identifie
1eae0 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  r.    ** of the 
1eaf0 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1eb00 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20  e sector pPg is 
1eb10 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20  located on..    
1eb20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70  */.    pg1 = ((p
1eb30 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28  Pg->pgno-1) & ~(
1eb40 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31  nPagePerSector-1
1eb50 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61  )) + 1;..    nPa
1eb60 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65  geCount = sqlite
1eb70 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1eb80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1eb90 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65   pPg->pgno>nPage
1eba0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
1ebb0 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e  Page = (pPg->pgn
1ebc0 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20  o - pg1)+1;.    
1ebd0 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e  }else if( (pg1+n
1ebe0 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29  PagePerSector-1)
1ebf0 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20  >nPageCount ){. 
1ec00 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1ec10 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20  geCount+1-pg1;. 
1ec20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec30 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72  nPage = nPagePer
1ec40 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  Sector;.    }.  
1ec50 20 20 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30    assert(nPage>0
1ec60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 67  );.    assert(pg
1ec70 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  1<=pPg->pgno);. 
1ec80 20 20 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e     assert((pg1+n
1ec90 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29  Page)>pPg->pgno)
1eca0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  ;..    for(ii=0;
1ecb0 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d   ii<nPage && rc=
1ecc0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b  =SQLITE_OK; ii++
1ecd0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67  ){.      Pgno pg
1ece0 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20   = pg1+ii;.     
1ecf0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
1ed00 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d  nJournal || pg==
1ed10 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20  pPg->pgno || .  
1ed20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61 67 65          pg>pPage
1ed30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c  r->origDbSize ||
1ed40 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1ed50 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c  urnal[pg/8]&(1<<
1ed60 28 70 67 26 37 29 29 29 0a 20 20 20 20 20 20 29  (pg&7))).      )
1ed70 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   {.        if( p
1ed80 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  g!=PAGER_MJ_PGNO
1ed90 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1eda0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
1edb0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
1edc0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1edd0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
1ede0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1edf0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ee00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ee10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1ee20 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1ee30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1ee40 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
1ee50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ee60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ee70 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
1ee80 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1ee90 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  Sync==1 );.    p
1eea0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1eeb0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1eec0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
1eed0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1eee0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1eef0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1ef00 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
1ef10 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1ef20 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
1ef30 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
1ef40 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  o sqlite3PagerWr
1ef50 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72  ite().  In other
1ef60 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
1ef70 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a  RUE if it is ok.
1ef80 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  ** to change the
1ef90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
1efa0 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  page..*/.#ifndef
1efb0 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69   NDEBUG.int sqli
1efc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1efd0 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50 67 29  ble(DbPage *pPg)
1efe0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e  {.  return pPg->
1eff0 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  dirty;.}.#endif.
1f000 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f010 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  OMIT_VACUUM./*.*
1f020 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f  * Replace the co
1f030 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c  ntent of a singl
1f040 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  e page with the 
1f050 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
1f060 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75  he third.** argu
1f070 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
1f080 69 74 65 33 50 61 67 65 72 4f 76 65 72 77 72 69  ite3PagerOverwri
1f090 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1f0a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
1f0b0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
1f0c0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
1f0d0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
1f0e0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1f0f0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a  r, pgno, &pPg);.
1f100 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f110 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1f120 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f130 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  e(pPg);.    if( 
1f140 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f150 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71  .      memcpy(sq
1f160 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1f170 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70  a(pPg), pData, p
1f180 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1f190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f1a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f1b0 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  g);.  }.  return
1f1c0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
1f1d0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1f1e0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1f1f0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1f200 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
1f210 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
1f220 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1f230 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
1f240 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
1f250 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
1f260 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
1f270 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1f280 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
1f290 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
1f2a0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
1f2b0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
1f2c0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
1f2d0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
1f2e0 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
1f2f0 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
1f300 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
1f310 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
1f320 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
1f330 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
1f340 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
1f350 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
1f360 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
1f370 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
1f380 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1f390 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
1f3a0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
1f3b0 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
1f3c0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
1f3d0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
1f3e0 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
1f3f0 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
1f400 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1f410 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1f420 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
1f430 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
1f440 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
1f450 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
1f460 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1f470 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
1f480 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
1f490 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
1f4a0 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
1f4b0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
1f4c0 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
1f4d0 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
1f4e0 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
1f4f0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1f500 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
1f510 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
1f520 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
1f530 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
1f540 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
1f550 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
1f560 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
1f570 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
1f580 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
1f590 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
1f5a0 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
1f5b0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1f5c0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1f5d0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
1f5e0 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
1f5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1f600 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
1f610 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1f620 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
1f630 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
1f640 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
1f650 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1f660 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
1f670 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1f680 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
1f690 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1f6a0 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
1f6b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f6c0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
1f6d0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1f6e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1f6f0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1f700 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1f710 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
1f720 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1f730 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1f740 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20  back = 1;.  if( 
1f750 70 50 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70  pPg->dirty && !p
1f760 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1f770 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f780 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1f790 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1f7a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
1f7b0 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d  bSize==(int)pPg-
1f7c0 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d  >pgno && pPager-
1f7d0 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67  >origDbSize<pPag
1f7e0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
1f7f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
1f800 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73 74  ages is the last
1f810 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
1f820 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68  e and the file h
1f830 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a  as grown.      *
1f840 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  * during the cur
1f850 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1f860 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61  , then do NOT ma
1f870 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 63  rk the page as c
1f880 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57  lean..      ** W
1f890 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
1f8a0 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20   file grows, we 
1f8b0 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
1f8c0 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1f8d0 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20  e.      ** gets 
1f8e0 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74  written at least
1f8f0 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68   once so that th
1f900 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c  e disk file will
1f910 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a   be the correct.
1f920 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49        ** size. I
1f930 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69  f you do not wri
1f940 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e 64  te this page and
1f950 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1f960 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f   file.      ** o
1f970 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20  n the disk ends 
1f980 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61  up being too sma
1f990 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61  ll, that can lea
1f9a0 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20  d to database.  
1f9b0 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f      ** corruptio
1f9c0 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78  n during the nex
1f9d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
1f9e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73       */.    }els
1f9f0 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  e{.      PAGERTR
1fa00 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45  ACE3("DONT_WRITE
1fa10 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
1fa20 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
1fa30 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1fa40 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1fa50 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20  CLEAN %p %d\n", 
1fa60 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1fa70 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  o)).      makeCl
1fa80 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66  ean(pPg);.#ifdef
1fa90 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1faa0 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
1fab0 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1fac0 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1fad0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1fae0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
1faf0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1fb00 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1fb10 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
1fb20 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
1fb30 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1fb40 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
1fb50 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
1fb60 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
1fb70 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1fb80 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
1fb90 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
1fba0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
1fbb0 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
1fbc0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1fbd0 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79  If we have not y
1fbe0 65 74 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  et actually read
1fbf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1fc00 74 68 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a  this page (if.**
1fc10 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
1fc20 65 61 64 20 66 6c 61 67 20 69 73 20 73 65 74 29  ead flag is set)
1fc30 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
1fc40 6e 65 20 61 63 74 73 20 61 73 20 61 20 70 72 6f  ne acts as a pro
1fc50 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20  mise.** that we 
1fc60 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20  will never need 
1fc70 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
1fc80 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20   content in the 
1fc90 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68  future..** so th
1fca0 65 20 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  e needRead flag 
1fcb0 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61  can be cleared a
1fcc0 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f  t this point..*/
1fcd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1fce0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44  erDontRollback(D
1fcf0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
1fd00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1fd10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61  Pg->pPager;..  a
1fd20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1fd30 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
1fd40 52 56 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  RVED );.  if( pP
1fd50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1fd60 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
1fd70 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
1fd80 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
1fd90 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1fda0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
1fdb0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
1fdc0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1fdd0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
1fde0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1fdf0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
1fe00 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1fe10 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
1fe20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1fe30 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1fe40 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1fe50 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
1fe60 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1fe70 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
1fe80 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
1fe90 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1fea0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61  .      pPager->a
1feb0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
1fec0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
1fed0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20  pgno&7);.    }. 
1fee0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1fef0 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
1ff00 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1ff10 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1ff20 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1ff30 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
1ff40 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
1ff50 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1ff60 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1ff70 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20  r->stmtInUse .  
1ff80 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65   && !pageInState
1ff90 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26  ment(pPg) .   &&
1ffa0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1ffb0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1ffc0 65 20 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65  e .  ){.    asse
1ffd0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1ffe0 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1fff0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
20000 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61  gDbSize );.    a
20010 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
20020 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
20030 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20040 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
20050 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
20060 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
20070 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
20080 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65   called to incre
20090 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  ment the databas
200a0 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f  e file change-co
200b0 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64  unter,.** stored
200c0 20 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74   at byte 24 of t
200d0 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
200e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
200f0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
20100 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  unter(Pager *pPa
20110 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
20120 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61  PgHdr;.  u32 cha
20130 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69  nge_counter;.  i
20140 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70  nt rc;..  if( !p
20150 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20160 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a  ntDone ){.    /*
20170 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
20180 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
20190 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ting. */.    rc 
201a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
201b0 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
201c0 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
201d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
201e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
201f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
20200 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
20210 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20220 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20230 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65  .  .    /* Incre
20240 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
20250 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
20260 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
20270 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
20280 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
20290 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
202a0 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
202b0 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
202c0 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
202d0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
202e0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
202f0 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
20300 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
20310 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
20320 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
20330 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
20340 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
20350 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Hdr);.    pPager
20360 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20370 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 1;.  }.  ret
20380 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20390 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
203a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
203b0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
203c0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
203d0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
203e0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
203f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
20400 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
20410 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
20420 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
20430 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
20440 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
20450 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
20460 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
20470 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
20480 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
20490 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
204a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
204b0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
204c0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
204d0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
204e0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
204f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20500 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
20510 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
20520 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
20530 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
20540 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
20550 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
20560 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
20570 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
20580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
20590 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
205a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
205b0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
205c0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
205d0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
205e0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
205f0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
20600 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
20610 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a  aseOne() call..*
20620 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
20630 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
20640 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
20650 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
20660 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
20670 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
20680 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
20690 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
206a0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
206b0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
206c0 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67  eOne(Pager *pPag
206d0 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
206e0 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
206f0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
20700 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
20710 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
20720 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
20730 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
20740 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
20750 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
20760 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
20770 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
20780 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
20790 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
207a0 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
207b0 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
207c0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
207d0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
207e0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
207f0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
20800 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
20810 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
20820 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
20830 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20840 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
20850 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
20860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20870 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
20880 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
20890 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
208a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
208b0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
208c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
208d0 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
208e0 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
208f0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
20900 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
20910 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
20920 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
20930 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
20940 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
20950 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
20960 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
20970 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
20980 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
20990 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
209a0 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
209b0 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
209c0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
209d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
209e0 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
209f0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
20a00 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
20a10 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
20a20 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
20a30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20a40 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
20a50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20a60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20a70 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
20a80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
20a90 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
20aa0 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
20ab0 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
20ac0 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
20ad0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
20ae0 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
20af0 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
20b00 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
20b10 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
20b20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
20b30 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
20b40 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
20b50 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
20b60 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
20b70 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
20b80 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
20b90 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
20ba0 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
20bb0 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
20bc0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
20bd0 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
20be0 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20c00 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20c10 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
20c20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20c40 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
20c50 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
20c60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20c70 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
20c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20c90 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20cb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20cc0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20cd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20ce0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
20cf0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
20d00 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
20d10 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
20d20 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
20d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20d40 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20d50 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
20d60 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
20d70 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20d80 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
20d90 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
20da0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20db0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
20dc0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
20dd0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20de0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20df0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
20e00 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
20e10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20e20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20e30 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
20e40 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
20e50 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
20e60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20e70 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
20e80 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
20e90 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
20ea0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
20eb0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
20ec0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
20ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20ee0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20ef0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
20f00 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63   0;..    /* Sync
20f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20f20 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
20f30 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
20f40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20f50 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
20f60 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
20f70 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
20f80 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
20f90 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
20fa0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20fb0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
20fc0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
20fd0 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
20fe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20ff0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
21000 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
21010 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28 20  ync_exit:.  if( 
21020 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
21030 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20  _BLOCKED ){.    
21040 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  /* pager_incr_ch
21050 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d 61  angecounter() ma
21060 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62 74  y attempt to obt
21070 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
21080 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20  .     * lock to 
21090 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20  spill the cache 
210a0 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52 52  and return IOERR
210b0 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73 69  _BLOCKED. But si
210c0 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65 72  nce .     * ther
210d0 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20 74  e is no chance t
210e0 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63 6f  he cache is inco
210f0 6e 73 69 73 74 65 6e 74 2c 20 69 74 27 73 0a 20  nsistent, it's. 
21100 20 20 20 20 2a 20 62 65 74 74 65 72 20 74 6f 20      * better to 
21110 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
21120 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  SY..     */.    
21130 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
21140 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21150 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
21160 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
21170 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21180 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
21190 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
211a0 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
211b0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
211c0 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
211d0 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
211e0 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
211f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
21200 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
21210 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
21220 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
21230 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
21240 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
21250 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
21260 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
21270 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
21280 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
21290 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
212a0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
212b0 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
212c0 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
212d0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
212e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
212f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47  ERROR;.  }.  PAG
21300 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54  ERTRACE2("COMMIT
21310 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21320 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
21330 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
21340 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
21350 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
21360 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
21370 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 50 67   pPg ){.      Pg
21380 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
21390 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
213a0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
213b0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
213c0 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  pHist);.      pP
213d0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
213e0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
213f0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  al = 0;.      pH
21400 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
21410 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
21420 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sync = 0;.      
21430 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
21440 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
21450 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
21460 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
21470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
21480 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
21490 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
214a0 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
214b0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
214c0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
214d0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
214e0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
214f0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
21500 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
21510 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
21520 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
21530 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
21540 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
21550 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
21560 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
21570 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
21580 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
21590 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
215a0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
215b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
215c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
215d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
215e0 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
215f0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
21600 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21610 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
21620 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
21630 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
21640 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
21650 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
21660 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
21670 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
21680 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
21690 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
216a0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
216b0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
216c0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
216d0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
216e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
216f0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
21700 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
21710 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
21720 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
21730 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
21740 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
21750 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
21760 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
21770 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
21780 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
21790 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
217a0 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
217b0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
217c0 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
217d0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
217e0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
217f0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
21800 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
21810 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
21820 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
21830 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
21840 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
21850 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
21860 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
21870 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
21880 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
21890 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
218a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
218b0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
218c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
218d0 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
218e0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
218f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
21900 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
21910 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
21920 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
21930 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
21940 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
21950 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
21960 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
21970 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
21980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
21990 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
219a0 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
219b0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
219c0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
219d0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
219e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
219f0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
21a00 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
21a10 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
21a20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
21a30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21a40 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
21a50 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
21a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
21a70 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
21a80 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
21a90 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
21aa0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
21ab0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
21ac0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
21ad0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
21ae0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
21af0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
21b00 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
21b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
21b20 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
21b30 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
21b40 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
21b50 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
21b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21b70 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
21b80 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
21b90 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
21ba0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
21bb0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
21bc0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
21bd0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
21be0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
21bf0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
21c00 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
21c10 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
21c20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
21c30 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
21c40 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
21c50 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
21c60 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
21c70 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
21c80 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
21c90 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
21ca0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
21cb0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
21cc0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
21cd0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
21ce0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
21cf0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
21d00 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
21d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21d20 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
21d30 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
21d40 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
21d50 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
21d60 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
21d70 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
21d80 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
21d90 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rc;.  }..  if( p
21da0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
21db0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
21dc0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
21dd0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
21de0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
21df0 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
21e00 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
21e10 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
21e20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50   }.    return pP
21e30 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
21e40 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
21e50 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
21e60 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
21e70 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
21e80 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
21e90 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72  Pager, 0);.    r
21ea0 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  c2 = pager_end_t
21eb0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
21ec0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
21ed0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21ee0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
21ef0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
21f00 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
21f10 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
21f20 20 20 7d 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72    }.  /* pager_r
21f30 65 73 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f  eset(pPager); */
21f40 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
21f50 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66  e = -1;..  /* If
21f60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
21f70 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41   during a ROLLBA
21f80 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f  CK, we can no lo
21f90 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20 70  nger trust the p
21fa0 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e  ager.  ** cache.
21fb0 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f 65   So call pager_e
21fc0 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77 61  rror() on the wa
21fd0 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e  y out to make an
21fe0 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65  y error .  ** pe
21ff0 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  rsistent..  */. 
22000 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
22010 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
22020 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
22030 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61 74   TRUE if the dat
22040 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70  abase file is op
22050 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  ened read-only. 
22060 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
22070 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
22080 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20   is (in theory) 
22090 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74  writable..*/.int
220a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
220b0 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70  eadonly(Pager *p
220c0 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
220d0 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
220e0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
220f0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
22100 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
22110 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74  he pager..*/.int
22120 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
22130 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
22140 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22150 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a  Pager->nRef;.}..
22160 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22170 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ST./*.** This ro
22180 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f  utine is used fo
22190 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
221a0 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a  alysis only..*/.
221b0 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67 65  int *sqlite3Page
221c0 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  rStats(Pager *pP
221d0 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
221e0 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
221f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
22200 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
22210 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
22220 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
22230 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
22240 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
22250 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
22260 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
22270 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
22280 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
22290 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
222a0 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
222b0 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65  [8] = 0;  /* Use
222c0 64 20 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e  d to be pPager->
222d0 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20  nOvfl */.  a[9] 
222e0 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b  = pPager->nRead;
222f0 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65  .  a[10] = pPage
22300 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74  r->nWrite;.  ret
22310 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn a;.}.#endif.
22320 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
22330 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
22340 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
22350 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
22360 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
22370 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
22380 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
22390 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
223a0 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
223b0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
223c0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
223d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
223e0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
223f0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
22400 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
22410 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
22420 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
22430 74 6d 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a  tmtBegin(Pager *
22440 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
22450 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  c;.  assert( !pP
22460 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22470 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
22480 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
22490 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73  R_SHARED );.  as
224a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
224b0 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47  Size>=0 );.  PAG
224c0 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42  ERTRACE2("STMT-B
224d0 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
224e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
224f0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
22500 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
22510 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
22520 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
22530 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
22540 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22550 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
22560 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22570 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
22580 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
22590 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
225a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
225b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
225c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
225d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
225e0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
225f0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
22600 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
22610 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
22620 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
22630 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
22640 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
22650 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
22660 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
22670 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
22680 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  BUG.  rc = sqlit
22690 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
226a0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
226b0 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
226c0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
226d0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
226e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
226f0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
22700 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22710 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
22720 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
22730 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
22740 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
22750 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
22760 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
22770 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
22780 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
22790 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
227a0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
227b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
227c0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
227d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
227e0 4f 70 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72  Opentemp(&pPager
227f0 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
22800 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
22810 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
22820 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
22830 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
22840 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
22850 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
22860 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
22870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22880 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
22890 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
228a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
228b0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
228c0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
228d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
228e0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
228f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22900 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
22910 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
22920 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
22930 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  Commit(Pager *pP
22940 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
22950 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
22960 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
22970 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41  , *pNext;.    PA
22980 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
22990 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
229a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
229b0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
229c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
229d0 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
229e0 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a  fd, 0);.      /*
229f0 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
22a00 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
22a10 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
22a20 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
22a30 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
22a40 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
22a50 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  mt = 0;.    }els
22a60 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  e{.      for(pPg
22a70 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
22a80 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
22a90 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
22aa0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
22ab0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
22ac0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
22ad0 70 4e 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70  pNext = pHist->p
22ae0 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20  NextStmt;.      
22af0 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
22b00 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
22b10 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
22b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48   = 0;.        pH
22b30 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  ist->pPrevStmt =
22b40 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
22b50 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  t = 0;.        s
22b60 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
22b70 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
22b80 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
22b90 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
22ba0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
22bb0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
22bc0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
22bd0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22be0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
22bf0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
22c00 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
22c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
22c30 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
22c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
22c50 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
22c60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
22c70 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
22c80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
22c90 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
22ca0 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
22cb0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
22cc0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
22cd0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
22ce0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
22cf0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
22d00 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 66 6f  *pHist;.      fo
22d10 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
22d20 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 48  tmt; pPg; pPg=pH
22d30 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  ist->pNextStmt){
22d40 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 20 3d  .        pHist =
22d50 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
22d60 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
22d70 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
22d80 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
22d90 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
22da0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48  TO_DATA(pPg), pH
22db0 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67  ist->pStmt, pPag
22dc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
22dd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46           sqliteF
22de0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
22df0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
22e00 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
22e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22e20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
22e30 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
22e40 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20  stmtSize;.      
22e50 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
22e60 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
22e70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22e80 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
22e90 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
22ea0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50  stmt_playback(pP
22eb0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
22ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
22ed0 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
22ee0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
22ef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22f00 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
22f10 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
22f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22f30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
22f40 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
22f50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22f60 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
22f70 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
22f80 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
22f90 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
22fa0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
22fb0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
22fc0 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
22fd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
22fe0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
22ff0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
23000 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65 72 20  erDirname(Pager 
23010 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
23020 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  rn pPager->zDire
23030 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ctory;.}../*.** 
23040 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
23050 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
23060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
23070 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
23080 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c  ite3PagerJournal
23090 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
230a0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
230b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
230c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
230d0 74 72 75 65 20 69 66 20 66 73 79 6e 63 28 29 20  true if fsync() 
230e0 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61 62 6c  calls are disabl
230f0 65 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ed for this page
23100 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  r.  Return FALSE
23110 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29 73 20  .** if fsync()s 
23120 61 72 65 20 65 78 65 63 75 74 65 64 20 6e 6f 72  are executed nor
23130 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  mally..*/.int sq
23140 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
23150 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
23160 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
23170 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66  ->noSync;.}..#if
23180 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
23190 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ODEC./*.** Set t
231a0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
231b0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
231c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
231d0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
231e0 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28  Pager,.  void *(
231f0 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
23200 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a  oid*,Pgno,int),.
23210 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
23220 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  g.){.  pPager->x
23230 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a  Codec = xCodec;.
23240 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63    pPager->pCodec
23250 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b  Arg = pCodecArg;
23260 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
23270 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
23280 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
23290 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 70 50  Move the page pP
232a0 67 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  g to location pg
232b0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  no in the file. 
232c0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
232d0 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
232e0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
232f0 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65  reviously locate
23300 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68  d at.** pgno (wh
23310 69 63 68 20 77 65 20 63 61 6c 6c 20 70 50 67 4f  ich we call pPgO
23320 6c 64 29 20 74 68 6f 75 67 68 20 74 68 61 74 20  ld) though that 
23330 70 61 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 20  page is allowed 
23340 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68  to be.** in cach
23350 65 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  e.  If the page 
23360 70 72 65 76 69 6f 75 73 20 6c 6f 63 61 74 65 64  previous located
23370 20 61 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20   at pgno is not 
23380 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68  already.** in th
23390 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
233a0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75  al, it is not pu
233b0 74 20 74 68 65 72 65 20 62 79 20 62 79 20 74 68  t there by by th
233c0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
233d0 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
233e0 74 68 65 20 70 61 67 65 20 70 50 67 20 72 65 6d  the page pPg rem
233f0 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
23400 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
23410 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
23420 77 69 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64  with pPg (i.e. d
23430 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
23440 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
23450 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
23460 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
23470 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
23480 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
23490 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
234a0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
234b0 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
234c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
234d0 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
234e0 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
234f0 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
23500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
23510 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
23520 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
23530 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
23540 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
23550 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
23560 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
23570 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
23580 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
23590 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
235a0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
235b0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
235c0 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
235d0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
235e0 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68   *pPgOld;  /* Th
235f0 65 20 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65  e page being ove
23600 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69  rwritten. */.  i
23610 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
23620 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
23630 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
23640 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45  Ref>0 );..  PAGE
23650 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64  RTRACE5("MOVE %d
23660 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
23670 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
23680 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
23690 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
236a0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
236b0 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
236c0 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45    IOTRACE(("MOVE
236d0 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50   %p %d %d\n", pP
236e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
236f0 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72   pgno))..  pager
23700 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
23710 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  );.  if( pPg->ne
23720 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
23730 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
23740 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
23750 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
23760 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e  al || (int)pgno>
23770 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
23780 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
23790 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
237a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
237b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
237c0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
237d0 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
237e0 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
237f0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
23800 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
23810 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
23820 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
23830 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
23840 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
23850 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
23860 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
23870 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
23880 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
23890 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
238a0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
238b0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
238c0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
238d0 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
238e0 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
238f0 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
23900 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
23910 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  0;.  pPgOld = pa
23920 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
23930 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
23940 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
23950 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
23960 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
23970 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
23980 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
23990 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
239a0 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  ld);.    pPg->ne
239b0 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d  edSync = pPgOld-
239c0 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c  >needSync;.  }el
239d0 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  se{.    pPg->nee
239e0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  dSync = 0;.  }. 
239f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
23a00 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
23a10 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
23a20 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
23a30 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
23a40 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f    (pPager->aInJo
23a50 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
23a60 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
23a70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
23a80 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
23a90 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
23aa0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
23ab0 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
23ac0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
23ad0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   );.  }..  /* Ch
23ae0 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
23af0 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
23b00 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
23b10 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
23b20 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
23b30 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
23b40 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
23b50 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
23b60 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
23b70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
23b80 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
23b90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
23ba0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
23bb0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
23bc0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
23bd0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
23be0 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
23bf0 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
23c00 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
23c10 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
23c20 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
23c30 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
23c40 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
23c50 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
23c60 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
23c70 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
23c80 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
23c90 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
23ca0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
23cb0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
23cc0 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
23cd0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
23ce0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
23cf0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
23d00 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
23d10 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
23d20 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
23d30 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
23d40 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
23d50 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
23d60 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
23d70 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
23d80 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
23d90 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
23da0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
23db0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
23dc0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
23dd0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
23de0 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
23df0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
23e00 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
23e10 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
23e20 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
23e30 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
23e40 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
23e50 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
23e60 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
23e70 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
23e80 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
23e90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
23ea0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
23eb0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
23ec0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
23ed0 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
23ee0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
23ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23f00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23f10 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
23f20 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
23f30 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  dr->needSync = 1
23f40 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e  ;.    pPgHdr->in
23f50 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
23f60 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64   makeDirty(pPgHd
23f70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  r);.    sqlite3P
23f80 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
23f90 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
23fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
23fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
23fc0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23fd0 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65  the data for the
23fe0 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
23ff0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
24000 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62  3PagerGetData(Db
24010 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
24020 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41  turn PGHDR_TO_DA
24030 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  TA(pPg);.}../*.*
24040 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
24050 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e  er to the Pager.
24060 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
24070 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a  "extra" space .*
24080 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
24090 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  g with the speci
240a0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
240b0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
240c0 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20  GetExtra(DbPage 
240d0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
240e0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
240f0 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28  ager;.  return (
24100 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f  pPager?PGHDR_TO_
24110 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
24120 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r):0);.}../*.** 
24130 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b  Get/set the lock
24140 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69  ing-mode for thi
24150 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74  s pager. Paramet
24160 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65  er eMode must be
24170 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52   one.** of PAGER
24180 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
24190 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  RY, PAGER_LOCKIN
241a0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20  GMODE_NORMAL or 
241b0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
241c0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e  GMODE_EXCLUSIVE.
241d0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
241e0 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c  r is not _QUERY,
241f0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63   then.** the loc
24200 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74  king-mode is set
24210 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70   to the value sp
24220 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  ecified..**.** T
24230 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
24240 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45  e is either PAGE
24250 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
24260 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52  RMAL or.** PAGER
24270 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
24280 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69  LUSIVE, indicati
24290 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
242a0 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
242b0 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64  ).** locking-mod
242c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
242d0 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
242e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
242f0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
24300 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
24310 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
24320 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
24330 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
24340 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
24350 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20  RMAL.           
24360 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
24370 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
24380 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  LUSIVE );.  asse
24390 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
243a0 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b  GMODE_QUERY<0 );
243b0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
243c0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
243d0 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f  MAL>=0 && PAGER_
243e0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
243f0 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66  USIVE>=0 );.  if
24400 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70  ( eMode>=0 && !p
24410 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
24420 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
24430 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65  xclusiveMode = e
24440 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
24450 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
24460 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
24470 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
24480 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
24490 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
244a0 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
244b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
244c0 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  te of the file l
244d0 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65  ock for the give
244e0 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20  n pager..** The 
244f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
24500 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20  one of NO_LOCK, 
24510 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
24520 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50  ERVED_LOCK,.** P
24530 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20  ENDING_LOCK, or 
24540 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a  EXCLUSIVE_LOCK..
24550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24560 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67  gerLockstate(Pag
24570 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
24580 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c  eturn sqlite3OsL
24590 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d  ockState(pPager-
245a0 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  >fd);.}.#endif..
245b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
245c0 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
245d0 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
245e0 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
245f0 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
24600 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
24610 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75  qlite3PagerRefdu
24620 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
24630 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
24640 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
24650 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
24660 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
24670 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
24680 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
24690 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
246a0 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
246b0 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
246c0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
246d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
246e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
246f0 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
24700 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
24710 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
24720 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.