/ Hex Artifact Content
Login

Artifact acfa86f50b71b7e289508b213bb88e68273d42a0:


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 34  : pager.c,v 1.34
0350: 30 20 32 30 30 37 2f 30 35 2f 30 39 20 32 30 3a  0 2007/05/09 20:
0360: 33 35 3a 33 31 20 64 72 68 20 45 78 70 20 24 0a  35:31 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 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2fa0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2fb0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2ff0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
3000: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
3010: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3030: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3040: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
3050: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a  tabase */.  u8 *
3060: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
3070: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3080: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3090: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30a0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
30b0: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
30c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
30d0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
30e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3100: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3110: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3120: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3130: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3140: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
3150: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
3160: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3170: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
3180: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3190: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
31a0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
31b0: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
31c0: 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  File *fd, *jfd; 
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
31e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
31f0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
3200: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
3210: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3230: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
3240: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3250: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
3260: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
3270: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
3280: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
3290: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67  yHandler */.  Pg
32a0: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
32b0: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
32c0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
32d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
32e0: 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  stSynced;       
32f0: 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70   /* First free p
3300: 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e  age with PgHdr.n
3310: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20  eedSync==0 */.  
3320: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3340: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
3350: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
3360: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
3370: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
3380: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
3390: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
33a0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
33b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
33c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
33d0: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
33e0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3400: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
3410: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
3420: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
3430: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
3440: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
3450: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
3460: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
3470: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
3480: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
3490: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
34a0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
34b0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
34c0: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
34d0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
34e0: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
34f0: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
3500: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
3510: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
3520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3530: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
3540: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3550: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
3560: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3570: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3580: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3590: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
35a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
35b0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
35c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
35d0: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
35e0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
35f0: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
3600: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3610: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
3620: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
3630: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
3640: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
3650: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3660: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
3670: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
3680: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
3690: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
36a0: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
36b0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
36c0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
36d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
36e0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
36f0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
3700: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
3710: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
3720: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
3730: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
3740: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
3750: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
3760: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
3770: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
3780: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
3790: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
37a0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
37b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
37c0: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
37d0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
37e0: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
37f0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
3800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
3810: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3820: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3830: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
3840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
3850: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
3860: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
3870: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
3880: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
38a0: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
38b0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
38c0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
38d0: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
38f0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
3900: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
3910: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
3920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
3930: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
3940: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
3950: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
3960: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
3970: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
3980: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
3990: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
39a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
39b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
39c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
39d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
39e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
39f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
3a00: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
3a10: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
3a20: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
3a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a40: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
3a50: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
3a60: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
3a70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
3a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a90: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
3aa0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
3ac0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
3ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3ae0: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
3af0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3b00: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
3b10: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
3b20: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3b30: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
3b40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
3b50: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
3b60: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
3b70: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
3b80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
3b90: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
3ba0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
3bb0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
3bc0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
3bd0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
3be0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
3bf0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
3c00: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
3c10: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
3c20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
3c30: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
3c40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
3c50: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
3c60: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
3c70: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
3c80: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
3c90: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
3ca0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
3cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
3cc0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
3cd0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
3ce0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
3cf0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
3d00: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
3d10: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
3d20: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
3d30: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
3d40: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
3d50: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
3d60: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
3d70: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
3d80: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
3d90: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
3da0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
3db0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
3dd0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
3de0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
3df0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
3e00: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
3e10: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
3e20: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
3e30: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
3e40: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
3e50: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
3e60: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
3e70: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
3e80: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
3e90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
3ea0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
3eb0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
3ec0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
3ed0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
3ee0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
3ef0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
3f00: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
3f10: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
3f20: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
3f30: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
3f40: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
3f50: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
3f60: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
3f70: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
3f80: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
3f90: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
3fa0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
3fb0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
3fc0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
3fd0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
3fe0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
3ff0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
4000: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
4010: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4020: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
4030: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
4040: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
4050: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
4060: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
4070: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4080: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
40a0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
40b0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
40c0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
40d0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
40e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
40f0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
4100: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
4110: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
4120: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
4130: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
4140: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4150: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
4160: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4170: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4180: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4190: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
41a0: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
41b0: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
41c0: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
41d0: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
41e0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
41f0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
4200: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
4210: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
4220: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
4230: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
4240: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
4250: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
4260: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
4270: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
4280: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
4290: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
42a0: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
42b0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
42c0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
42d0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
42e0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
42f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
4300: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
4310: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
4320: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
4330: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
4340: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
4350: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
4360: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
4370: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
4380: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
4390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
43a0: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
43b0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
43c0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
43d0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
43e0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43f0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
4400: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
4410: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
4420: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
4430: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4440: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4450: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4460: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4470: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4480: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4490: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
44a0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
44b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
44c0: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
44d0: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
4500: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
4510: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
4520: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
4530: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4540: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4550: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4560: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4570: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4580: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4590: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
45a0: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
45b0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
45c0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
45d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
4600: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
4610: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
4620: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
4630: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4640: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4650: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4660: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4670: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4680: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4690: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
46a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
46b0: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
46c0: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
46d0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46e0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46f0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
4700: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
4710: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
4720: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
4730: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4740: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
4750: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
4760: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
4770: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
4780: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
4790: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
47a0: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
47b0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
47c0: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
47d0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
47e0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
47f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4800: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
4810: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
4820: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
4830: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
4840: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
4850: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
4860: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
4870: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
4880: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
4890: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
48a0: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
48b0: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
48c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
48d0: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
48e0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
48f0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4900: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
4910: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
4920: 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  n PGHDR_TO_HIST(
4930: 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e  pPg, pPager)->in
4940: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
4950: 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
4960: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38  Pg->pgno;.    u8
4970: 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49   *a = pPager->aI
4980: 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72  nStmt;.    retur
4990: 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e  n (a && (int)pgn
49a0: 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
49b0: 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38  ize && (a[pgno/8
49c0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
49d0: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  )));.  }.}../*.*
49e0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
49f0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4a00: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
4a10: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
4a20: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
4a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
4a40: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
4a50: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
4a60: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
4a70: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
4a80: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
4a90: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
4aa0: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
4ab0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4ac0: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
4ad0: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
4ae0: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
4af0: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
4b00: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
4b10: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
4b20: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
4b30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
4b50: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
4b60: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
4b70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
4b80: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72  h = aHash;.  for
4b90: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4ba0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4bb0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4bc0: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
4bd0: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
4be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
4bf0: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
4c00: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
4c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4c30: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
4c40: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
4c50: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
4c60: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
4c70: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
4c80: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
4c90: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
4ca0: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
4cb0: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
4cc0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
4cd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
4ce0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4cf0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4d00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4d20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4d30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4d50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4d60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4d70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4d80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4d90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4da0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4db0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4dc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4dd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
4de0: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
4df0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4e00: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4e10: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4e20: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4e30: 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66  izeof(ac));.  if
4e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4e50: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
4e60: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
4e70: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
4e80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4e90: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4ea0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
4eb0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
4ec0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
4ed0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
4ee0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
4ef0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
4f00: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
4f10: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4f20: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4f30: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4f40: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4f50: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4f60: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4f70: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4f80: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4fa0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4fb0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4fc0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4fd0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4fe0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4ff0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
5000: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
5010: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
5020: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
5030: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
5040: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
5050: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
5060: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
5070: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
5080: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
5090: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
50a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
50b0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
50c0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
50d0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
50e0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
50f0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5100: 28 61 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  (ac);.}.../*.** 
5110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
5120: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
5130: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hen an error occ
5140: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  urs within the p
5150: 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ager.** code. Th
5160: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5170: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
5180: 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
5190: 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63  ture, the.** sec
51a0: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
51b0: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
51c0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
51d0: 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
51e0: 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72   .** The value r
51f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
5200: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
5210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
5220: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
5230: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
5240: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
5250: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
5260: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
5270: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
5280: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
5290: 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75  rsistent. All su
52a0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
52b0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
52c0: 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  .** will immedia
52d0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
52e0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  same error code.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5300: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
5310: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
5320: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
5330: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
5340: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
5350: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
5360: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
5370: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
5380: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
5390: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
53a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53b0: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
53c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
53d0: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
53e0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
53f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5400: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5410: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
5420: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
5430: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
5440: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
5450: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
5460: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
5470: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
5480: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5490: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
54a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
54b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
54c0: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
54d0: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
54e0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
54f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
5500: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
5510: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
5520: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
5530: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
5540: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5550: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5560: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5570: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5580: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
5590: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
55a0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
55b0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
55c0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
55d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
55e0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
55f0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
5600: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
5610: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
5620: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5630: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
5640: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5650: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5660: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5670: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5680: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
5690: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
56a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
56b0: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
56c0: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
56d0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
56e0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
56f0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
5700: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5710: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
5720: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
5730: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
5740: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
5750: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
5760: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
5770: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5780: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5790: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
57a0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
57b0: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
57c0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
57d0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
57e0: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
57f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5800: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
5810: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5820: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
5830: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
5840: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
5850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
5860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5870: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5880: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5890: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
58a0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
58b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
58c0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
58d0: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
58e0: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
58f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5900: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5910: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5920: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
5930: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5940: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5950: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5960: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5970: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5980: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5990: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
59a0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
59b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
59c0: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
59d0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
59e0: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
59f0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
5a00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5a10: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5a20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5a30: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
5a40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5a60: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5a70: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5a80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5a90: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5aa0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5ab0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5ac0: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5ad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5ae0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
5af0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
5b00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5b20: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
5b30: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
5b40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5b50: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5b60: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5b70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5b80: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5b90: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5bb0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5bc0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5bd0: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5be0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5bf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5c00: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5c10: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5c20: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
5c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
5c40: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5c50: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5c70: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5c80: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5c90: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5ca0: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5cb0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5cc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5cd0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5ce0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
5cf0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
5d00: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
5d10: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5d20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5d30: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
5d40: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5d50: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5d60: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5d70: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5d80: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5d90: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5da0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5db0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5dc0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5dd0: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5de0: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
5e00: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
5e10: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
5e40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e50: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5e60: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5e70: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5e80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5e90: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5ea0: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5eb0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5ec0: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5ed0: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5ee0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
5ef0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
5f00: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
5f10: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5f20: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
5f30: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5f80: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5fa0: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5fc0: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5fe0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5ff0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
6000: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
6010: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
6020: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
6030: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6040: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
6050: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
6060: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
6070: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
6080: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
6090: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
60a0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
60b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
60c0: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
60d0: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
60e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
60f0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
6100: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
6110: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
6120: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
6130: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6140: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6150: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6160: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
6170: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6180: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6190: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
61a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
61b0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
61c0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
61d0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
61e0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
61f0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
6200: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
6210: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
6220: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
6230: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
6240: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
6250: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
6260: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
6270: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
6280: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
6290: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
62a0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
62b0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
62c0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
62d0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
62e0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
62f0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
6300: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
6310: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
6320: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
6330: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
6340: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6350: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
6360: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
6370: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
6380: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
6390: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
63a0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
63b0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
63c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
63d0: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
63e0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
63f0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
6400: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
6410: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
6420: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
6430: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
6440: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6450: 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ff;.  }..  rc = 
6460: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6470: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6480: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6490: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
64a0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
64b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
64c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
64d0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
64e0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
64f0: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
6500: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
6510: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
6520: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
6530: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
6540: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
6550: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
6560: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
6570: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
6580: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
6590: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
65a0: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
65b0: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
65c0: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
65d0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
65e0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
65f0: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
6600: 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65   */.  memcpy(zHe
6610: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
6620: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
6630: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f  rnalMagic));.  /
6640: 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64  * The nRec Field
6650: 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72  . 0xFFFFFFFF for
6660: 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c   no-sync journal
6670: 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  s. */.  put32bit
6680: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6690: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
66a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ], pPager->noSyn
66b0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
66c0: 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61   0);.  /* The ra
66d0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
66e0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
66f0: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
6700: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
6710: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
6720: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6730: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
6740: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
6760: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
6770: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
6780: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
6790: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
67a0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
67b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
67c0: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
67d0: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
67e0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
67f0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
6800: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
6810: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6820: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6830: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
6840: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6850: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
6860: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
6870: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
6880: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
6890: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
68a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
68b0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
68c0: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
68d0: 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a  zHeader));..  /*
68e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
68f0: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
6900: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
6910: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
6920: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
6930: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
6940: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
6950: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
6960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
6970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6980: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49    IOTRACE(("JTAI
6990: 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  L %p %lld\n", pP
69a0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
69b0: 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20  urnalOff-1)).   
69c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
69d0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
69e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
69f0: 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  Off-1);.    if( 
6a00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6a10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6a20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6a30: 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20  r->jfd, "\000", 
6a40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
6a50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6a60: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6a70: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6a80: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
6a90: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
6aa0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
6ab0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6ac0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
6ad0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
6ae0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
6af0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
6b00: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6b10: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
6b20: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
6b30: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6b40: 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   of.** the journ
6b50: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
6b60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
6b70: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
6b80: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65  ccessfully, *nRe
6b90: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
6ba0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
6bb0: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
6bc0: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
6bd0: 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73  and *dbSize is s
6be0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
6bf0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
6c00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
6c10: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
6c20: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
6c30: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6c40: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
6c50: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6c60: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
6c70: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
6c80: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
6c90: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
6ca0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
6cb0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
6cc0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
6cd0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
6ce0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
6cf0: 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64  ed and *nRec and
6d00: 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74   *dbSize are not
6d10: 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41   set.  If JOURNA
6d20: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
6d30: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
6d40: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6d50: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
6d60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6d80: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
6d90: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
6da0: 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53   .  i64 journalS
6db0: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
6dc0: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
6dd0: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
6de0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6df0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6e00: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6e10: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6e20: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a  */..  rc = seekJ
6e30: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6e40: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6e50: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
6e60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6e70: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
6e80: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
6e90: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
6ea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6eb0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  E;.  }..  rc = s
6ec0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
6ed0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6ee0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6ef0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6f00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
6f10: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
6f20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6f30: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
6f40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6f50: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6f60: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6f70: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6f80: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
6f90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6fa0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6fb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
6fc0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6fd0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6fe0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6ff0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7000: 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65  er->jfd, pDbSize
7010: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
7020: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
7030: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
7040: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
7050: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
7060: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
7070: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
7080: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
7090: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
70a0: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
70b0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
70c0: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
70d0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
70e0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
70f0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
7100: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
7110: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
7120: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
7130: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
7140: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
7150: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
7160: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
7170: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
7180: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7190: 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  d, (u32 *)&pPage
71a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
71b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
71c0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
71d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
71e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
71f0: 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
7200: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
7210: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
7220: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
7230: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
7240: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
7250: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
7260: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
7270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7280: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
7290: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
72a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
72b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
72c0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
72d0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
72e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
72f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
7300: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
7310: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
7320: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
7330: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
7340: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
7350: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
7360: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
7370: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
7380: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
7390: 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79  is:.**.** + 4 by
73a0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
73b0: 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73  NO..** + N bytes
73c0: 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74  : length of mast
73d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
73e0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  .** + 4 bytes: N
73f0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  .** + 4 bytes: M
7400: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7410: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
7420: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
7430: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
7440: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
7450: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
7460: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
7470: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
7480: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
7490: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  nal name..**.** 
74a0: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
74b0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
74c0: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
74d0: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
74e0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
74f0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
7500: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
7510: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
7520: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
7530: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
7540: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
7550: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
7560: 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63   int i; .  u32 c
7570: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
7580: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
7590: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
75a0: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
75b0: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
75c0: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
75d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
75e0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
75f0: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
7600: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
7610: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
7620: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
7630: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
7640: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
7650: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
7660: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
7670: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
7680: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
7690: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
76a0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
76b0: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
76c0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
76d0: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
76e0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
76f0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
7700: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
7710: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
7720: 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  .    rc = seekJo
7730: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
7740: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7750: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7760: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
7770: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
7780: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
7790: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
77a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45  Pager->jfd, PAGE
77b0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
77c0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
77d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
77e0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
77f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
7800: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
7810: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
7820: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7830: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33  turn rc;..  put3
7840: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
7850: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
7860: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
7870: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
7880: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
7890: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
78a0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
78b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
78c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
78d0: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
78e0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70  rnalMagic));.  p
78f0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
7900: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
7910: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
7920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20  }../*.** Add or 
7930: 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72  remove a page fr
7940: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  om the list of a
7950: 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ll pages that ar
7960: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74  e in the.** stat
7970: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
7980: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b  *.** The Pager k
7990: 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20  eeps a separate 
79a0: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68  list of pages th
79b0: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
79c0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   in.** the state
79d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
79e0: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
79f0: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
7a00: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
7a10: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
7a20: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
7a30: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
7a40: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
7a50: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
7a60: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
7a70: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
7a80: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
7a90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
7aa0: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
7ab0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7ac0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7ad0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
7ae0: 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
7af0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7b00: 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61  Pg, pPager);.  a
7b10: 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a  ssert( MEMDB );.
7b20: 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e    if( !pHist->in
7b30: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
7b40: 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76  rt( pHist->pPrev
7b50: 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74  Stmt==0 && pHist
7b60: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29  ->pNextStmt==0 )
7b70: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
7b80: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
7b90: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7ba0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50  Pager->pStmt, pP
7bb0: 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74  ager)->pPrevStmt
7bc0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
7bd0: 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74    pHist->pNextSt
7be0: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
7bf0: 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  mt;.    pPager->
7c00: 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  pStmt = pPg;.   
7c10: 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
7c20: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
7c30: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
7c40: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
7c50: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
7c60: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7c80: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7c90: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7ca0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7cb0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7cc0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7cd0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7ce0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7cf0: 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72  aHash==0 ) retur
7d00: 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65  n 0;.  p = pPage
7d10: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20  r->aHash[pgno & 
7d20: 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
7d30: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
7d40: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
7d50: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
7d60: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
7d70: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7d80: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7d90: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
7da0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7db0: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
7dc0: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
7dd0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
7de0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mode ){.    if( 
7df0: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
7e00: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7e10: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7e20: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  OCK);.      pPag
7e30: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
7e40: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
7e50: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
7e60: 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20  Pager)).    }.  
7e70: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7e80: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7e90: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
7ea0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
7eb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ec0: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
7ed0: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
7ee0: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
7ef0: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
7f00: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
7f10: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
7f20: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
7f30: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a  lready entered.*
7f40: 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  * the error-stat
7f50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7f60: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
7f70: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
7f80: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72  p){.  if( p->err
7f90: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7fa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
7fb0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
7fc0: 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  D || p->journalO
7fd0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pen==0 );.  if( 
7fe0: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
7ff0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
8000: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
8010: 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70  back(p);.  }.  p
8020: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a  ager_unlock(p);.
8030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
8040: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72  Code || !p->jour
8050: 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65  nalOpen || (p->e
8060: 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70  xclusiveMode&&!p
8070: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b  ->journalOff) );
8080: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
8090: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d  rCode || !p->stm
80a0: 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c  tOpen || p->excl
80b0: 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a  usiveMode );.}..
80c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
80d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
80e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
80f0: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
8100: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
8110: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
8120: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
8130: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
8140: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
8150: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
8160: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
8170: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
8180: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
8190: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
81a0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
81b0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
81c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
81d0: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
81e0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
81f0: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  g, *pNext;.  if(
8200: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8210: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8220: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
8230: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
8240: 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t){.    IOTRACE(
8250: 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
8260: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
8270: 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45  pgno));.    PAGE
8280: 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
8290: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
82a0: 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t);.    pNext = 
82b0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
82c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
82d0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
82e0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
82f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
8300: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
8310: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
8320: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
8330: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
8340: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
8350: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
8360: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8370: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
8380: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
8390: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
83a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
83b0: 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ef = 0;.}../*.**
83c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
83d0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
83e0: 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
83f0: 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74   is ended by eit
8400: 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20  her.** a COMMIT 
8410: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  or a ROLLBACK..*
8420: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
8430: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8440: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
8450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8460: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
8470: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
8480: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
8490: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
84a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
84b0: 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74  lease.** the dat
84c0: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
84d0: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
84e0: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
84f0: 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a  ce if that is.**
8500: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8510: 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52   thing to do.  R
8520: 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75  elease locks usu
8530: 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69  ally is appropri
8540: 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77  ate,.** unless w
8550: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
8560: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f  ve access mode o
8570: 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  r unless this is
8580: 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e   a .** COMMIT AN
8590: 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42  D BEGIN or ROLLB
85a0: 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70  ACK AND BEGIN op
85b0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  eration..**.** T
85c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
85d0: 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65  is either delete
85e0: 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a  d or truncated..
85f0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
8600: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
8610: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
8620: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
8630: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
8640: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
8650: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
8660: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
8670: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
8680: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
8690: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
86a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
86b0: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
86c0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
86d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
86e0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
86f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8700: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
8710: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
8720: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
8730: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
8740: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
8750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8760: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
8770: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
8780: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
8790: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
87a0: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
87b0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
87c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
87d0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
87e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
87f0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
8800: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
8820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
8830: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
8840: 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
8850: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
8860: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
8870: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
8880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8890: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
88a0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
88b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
88c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
88d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
88e0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
88f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8900: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
8910: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
8920: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8930: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
8940: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8960: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
8970: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
8980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8990: 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
89a0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
89b0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
89c0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
89d0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
89e0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
89f0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
8a00: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
8a10: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8a20: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
8a30: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
8a40: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
8a50: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
8a60: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
8a70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8a80: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
8a90: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
8aa0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
8ab0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
8ac0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
8ad0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
8ae0: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
8af0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
8b00: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
8b10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8b20: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
8b30: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8b40: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8b50: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
8b60: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
8b70: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
8b80: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8b90: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
8ba0: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
8bb0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
8bc0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
8bd0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8be0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
8bf0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
8c00: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
8c10: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
8c20: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8c30: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
8c40: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
8c50: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
8c60: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8c70: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8c80: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
8c90: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
8ca0: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
8cb0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  irst;.  pPager->
8cc0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
8cd0: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
8ce0: 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
8cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8d00: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
8d10: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
8d20: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
8d30: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
8d40: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
8d50: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
8d60: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
8d70: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
8d80: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
8d90: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
8da0: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
8db0: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
8dc0: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
8dd0: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
8de0: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
8df0: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
8e00: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
8e10: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
8e20: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
8e30: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
8e40: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
8e50: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8e60: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
8e70: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
8e80: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
8e90: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
8ea0: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
8eb0: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
8ec0: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
8ed0: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
8ee0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
8ef0: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
8f00: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
8f10: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
8f20: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
8f30: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
8f40: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
8f50: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
8f60: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
8f70: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
8f80: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
8f90: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
8fa0: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
8fb0: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
8fc0: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
8fd0: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
8fe0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
8ff0: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
9000: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
9010: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
9020: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
9030: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
9040: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
9050: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
9060: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
9070: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
9080: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
9090: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
90a0: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
90b0: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
90c0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
90d0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
90e0: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
90f0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
9100: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
9110: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
9120: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
9130: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
9140: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
9150: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
9160: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
9170: 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77  ageSize-200;.  w
9180: 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
9190: 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
91a0: 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
91b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
91c0: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ksum;.}../* Forw
91d0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
91e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
91f0: 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29  akeClean(PgHdr*)
9200: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  ;../*.** Read a 
9210: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
9220: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9230: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
9240: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
9250: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
9260: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
9270: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
9280: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
9290: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
92a0: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
92b0: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
92c0: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
92d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
92e0: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
92f0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
9300: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
9310: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
9320: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
9330: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
9340: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
9350: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
9360: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
9370: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
9380: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
93b0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
93c0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
93d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
93e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
93f0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
9400: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
9410: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
9440: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
9450: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
9460: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
9470: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
9480: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
9490: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
94a0: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
94b0: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
94c0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
94d0: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
94e0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
94f0: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
9500: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
9510: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
9520: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
9530: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
9540: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
9550: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
9560: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
9570: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
9580: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
9590: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
95a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
95b0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
95c0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
95d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
95e0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
95f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
9600: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
9610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9620: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9630: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
9640: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
9650: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
9660: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
9670: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
9680: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
9690: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
96a0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
96b0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
96c0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
96d0: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
96e0: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
96f0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
9700: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
9710: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
9720: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
9730: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
9740: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
9750: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
9760: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
9770: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
9780: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
9790: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
97a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
97b0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
97c0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
97d0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
97e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
97f0: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
9800: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
9810: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
9820: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
9830: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9840: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9850: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
9860: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
9870: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
9880: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
9890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
98a0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
98b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98c0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
98d0: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
98e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
98f0: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
9900: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
9910: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
9920: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
9930: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
9940: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
9950: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9960: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
9970: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
9980: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
9990: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
99a0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
99b0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
99c0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
99d0: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
99e0: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
99f0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
9a00: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
9a10: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
9a20: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
9a30: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
9a40: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
9a50: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
9a60: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
9a70: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
9a80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
9a90: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
9aa0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
9ab0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
9ac0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9ad0: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9ae0: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9af0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9b00: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9b10: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9b20: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9b30: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9b40: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9b50: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9b60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
9b70: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
9b80: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
9b90: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
9ba0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
9bb0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
9bc0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9bd0: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9be0: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9bf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9c00: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9c10: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9c20: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9c30: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9c40: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9c50: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9c60: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
9c70: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
9c80: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
9c90: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
9ca0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
9cb0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
9cc0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9cd0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9ce0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9cf0: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9d00: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9d10: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9d20: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9d30: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9d40: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9d50: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9d60: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
9d70: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
9d80: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
9d90: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
9da0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
9db0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
9dc0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9dd0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9df0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9e00: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9e10: 50 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg!=0 );.  PAGER
9e20: 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b  TRACE3("PLAYBACK
9e30: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
9e40: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
9e50: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
9e60: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9e70: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
9e80: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
9e90: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a  needSync==0) ){.
9ea0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9eb0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
9ec0: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
9ed0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
9ee0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
9ef0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9f00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9f10: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
9f20: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
9f30: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9f40: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29   }.    if( pPg )
9f50: 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  {.      makeClea
9f60: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
9f70: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
9f80: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
9f90: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
9fa0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
9fb0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
9fc0: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
9fd0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
9fe0: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
9ff0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
a000: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
a010: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
a020: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
a030: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
a040: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
a050: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
a060: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
a070: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
a080: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
a090: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
a0a0: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
a0b0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
a0c0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
a0d0: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
a0e0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
a0f0: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
a100: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
a110: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a120: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
a130: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
a140: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a150: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
a160: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
a170: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
a180: 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65  niter(pPg, pPage
a190: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a1a0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a1b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
a1c0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
a1d0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
a1e0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
a1f0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
a200: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
a210: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
a220: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
a230: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
a240: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
a250: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
a260: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
a270: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
a280: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
a290: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
a2a0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
a2b0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
a2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
a2d0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
a2e0: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
a2f0: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
a300: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
a310: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
a320: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a330: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
a340: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
a350: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
a360: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a370: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
a380: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
a390: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
a3a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a3b0: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
a3c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
a3d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
a3e0: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
a3f0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
a400: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a410: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
a420: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
a430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
a440: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a450: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
a460: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
a470: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
a480: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
a490: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a4a0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
a4b0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
a4c0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
a4d0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
a4e0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
a4f0: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
a500: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
a510: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
a520: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
a530: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
a540: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
a550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
a560: 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68  lmaster(const ch
a570: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
a580: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
a590: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
a5a0: 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20   OsFile *master 
a5b0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  = 0;.  char *zMa
a5c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
a5d0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
a5e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a5f0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
a600: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
a610: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
a620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a630: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
a640: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a650: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
a660: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
a670: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
a680: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
a690: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
a6a0: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
a6b0: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
a6c0: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
a6d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
a6e0: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74  enReadOnly(zMast
a6f0: 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20  er, &master);.  
a700: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
a710: 54 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20  TE_OK || master 
a720: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a730: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a740: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
a750: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
a760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a770: 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c  FileSize(master,
a780: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
a790: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a7a0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a7b0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a7c0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
a7d0: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
a7e0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
a7f0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
a800: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
a810: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
a820: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a830: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
a840: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
a850: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
a860: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
a870: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
a880: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
a890: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
a8a0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
a8b0: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
a8c0: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
a8d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
a8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a8f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a900: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a910: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
a920: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a930: 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  (master, zMaster
a940: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
a950: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
a960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a970: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a980: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
a990: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
a9a0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
a9b0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
a9c0: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
a9d0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
a9e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
a9f0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
aa00: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
aa10: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
aa20: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
aa30: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
aa40: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
aa50: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
aa60: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
aa70: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
aa80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
aa90: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
aaa0: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
aab0: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
aac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
aad0: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
aae0: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a         OsFile *j
aaf0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
ab00: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
ab10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ab20: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
ab30: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
ab40: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
ab50: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
ab60: 4b 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a  K || journal );.
ab70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
ab80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ab90: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
aba0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
abb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
abc0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
abd0: 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a  rnal(journal, &z
abe0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
abf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ac00: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
ac10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ac20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ac30: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ac40: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ac50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
ac60: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
ac70: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
ac80: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
ac90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
aca0: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
acb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
acc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
acd0: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
ace0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
acf0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ad00: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
ad10: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ad20: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ad30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ad40: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
ad50: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
ad60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
ad70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
ad80: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
ad90: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
ada0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
adb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
adc0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
add0: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
ade0: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
adf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ae00: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
ae10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ae20: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
ae30: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
ae40: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
ae50: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
ae60: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
ae70: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
ae80: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
ae90: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
aea0: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
aeb0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
aec0: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
aed0: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
aee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
aef0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
af00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
af10: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
af20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
af30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
af40: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
af50: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
af60: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
af70: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
af80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
af90: 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  i64)nPage);.  }.
afa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
afb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
afc0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
afd0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
afe0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
aff0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
b000: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
b010: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
b020: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
b030: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
b040: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
b050: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
b060: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65  e sector size re
b070: 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  ported.** by sql
b080: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
b090: 28 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53  () and the pageS
b0a0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ize..*/.static v
b0b0: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
b0c0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
b0d0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  {.  pPager->sect
b0e0: 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
b0f0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
b100: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20  ger->fd);.  if( 
b110: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
b120: 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze<pPager->pageS
b130: 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ize ){.    pPage
b140: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
b150: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b160: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
b170: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
b180: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
b190: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
b1a0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
b1b0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
b1c0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
b1d0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
b1e0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
b1f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
b200: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
b210: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
b220: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
b230: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
b240: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
b250: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b260: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b270: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b280: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
b290: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
b2a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b2b0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
b2c0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
b2d0: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
b2e0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
b2f0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
b300: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b310: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
b320: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b330: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b340: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
b350: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
b360: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
b370: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
b380: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
b390: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
b3a0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
b3b0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
b3c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
b3d0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
b3e0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
b3f0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b400: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b410: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
b420: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
b430: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
b440: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
b450: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
b460: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
b470: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
b480: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
b490: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
b4a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b4b0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
b4c0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
b4d0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
b4e0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
b4f0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
b500: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
b510: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
b520: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
b530: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
b540: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
b550: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
b560: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
b570: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
b580: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
b590: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
b5a0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
b5b0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
b5c0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
b5d0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
b5e0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
b5f0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
b600: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b610: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
b620: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b630: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
b640: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
b650: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
b660: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
b670: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
b680: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
b690: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
b6a0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
b6b0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
b6c0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
b6d0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
b6e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
b6f0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
b700: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b710: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
b720: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
b730: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
b740: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
b750: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
b760: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
b770: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
b780: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
b790: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
b7a0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
b7b0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
b7c0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
b7d0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
b7e0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
b7f0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
b800: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b810: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
b820: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
b830: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
b840: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
b850: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
b860: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
b870: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
b880: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
b890: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
b8a0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
b8b0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
b8c0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
b8d0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
b8e0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
b8f0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
b900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
b910: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
b920: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
b930: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
b940: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
b950: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
b960: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
b970: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
b980: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
b990: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
b9a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
b9b0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
b9c0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
b9d0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
b9e0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
b9f0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
ba00: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
ba10: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
ba20: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
ba30: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
ba40: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
ba50: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
ba60: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
ba70: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
ba80: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
ba90: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
baa0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
bab0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
bac0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
bad0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
bae0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
baf0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
bb00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
bb10: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
bb20: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
bb30: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
bb40: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
bb50: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
bb60: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
bb70: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
bb80: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
bb90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
bba0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
bbb0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
bbc0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
bbd0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
bbe0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bbf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
bc00: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bc10: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
bc20: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
bc30: 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc50: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
bc60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
bc70: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
bc80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bc90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
bca0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
bcb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
bcc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bce0: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
bcf0: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
bd00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
bd10: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
bd20: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
bd30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
bd40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bd50: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
bd60: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
bd70: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
bd80: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
bd90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
bda0: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
bdb0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
bdc0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
bdd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
bde0: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
bdf0: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
be00: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
be10: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
be20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
be30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
be40: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
be50: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
be60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
be70: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
be80: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
be90: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
bea0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
beb0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
bec0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
bed0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
bee0: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
bef0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bf00: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
bf10: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
bf20: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
bf30: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
bf40: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
bf50: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
bf60: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
bf70: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
bf80: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
bf90: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
bfa0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
bfb0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
bfc0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
bfd0: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
bfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
bff0: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
c000: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
c010: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
c020: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c030: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
c040: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
c050: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
c060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c070: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c080: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
c090: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
c0a0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
c0b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c0c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
c0d0: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
c0e0: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
c0f0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c100: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
c110: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
c120: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
c130: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
c140: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
c150: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
c160: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
c170: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c180: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
c190: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
c1a0: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
c1b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
c1c0: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
c1d0: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
c1e0: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
c1f0: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
c200: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
c210: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
c220: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
c230: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
c240: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
c250: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c260: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
c270: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c280: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
c290: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
c2a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c2b0: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
c2c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
c2d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c2f0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
c300: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c310: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
c320: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
c330: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
c340: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
c350: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
c360: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
c370: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
c380: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
c390: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
c3a0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
c3b0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
c3c0: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
c3d0: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
c3e0: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
c3f0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
c400: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
c410: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
c420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c430: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
c440: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c450: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c460: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
c470: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
c480: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
c490: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
c4a0: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
c4b0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c4c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c4d0: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
c4e0: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
c4f0: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
c500: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
c510: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
c520: 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ss. In this case
c530: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c540: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
c550: 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a  nsists of.    **
c560: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69   journalled copi
c570: 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  es of pages that
c580: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61 64   need to be read
c590: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63   back into the c
c5a0: 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
c5b0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
c5c0: 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20  !isHot ){.      
c5d0: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
c5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c5f0: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
c600: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c610: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
c620: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
c630: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
c640: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
c650: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
c660: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
c670: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
c680: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
c690: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c6a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c6b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c6c0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
c6d0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c6e0: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
c6f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c700: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c710: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c720: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
c730: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c740: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c750: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c760: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c780: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
c790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
c7a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c7b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c7c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c7d0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
c7e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c7f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c800: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c810: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c830: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
c840: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c850: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
c860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c880: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c890: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
c8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c8b0: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
c8c0: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
c8d0: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
c8e0: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
c8f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c900: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
c910: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
c920: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
c930: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
c940: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
c950: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
c960: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c970: 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
c980: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
c990: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
c9a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
c9b0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
c9c0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
c9d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c9e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
c9f0: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
ca00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ca10: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
ca20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
ca30: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
ca40: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
ca50: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
ca60: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
ca70: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
ca80: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
ca90: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
caa0: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
cab0: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
cac0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
cad0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
cae0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
caf0: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
cb00: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
cb10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cb20: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
cb30: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
cb40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
cb50: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
cb60: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
cb70: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
cb80: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
cb90: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
cba0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
cbb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
cbc0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
cbd0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
cbe0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
cbf0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
cc00: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
cc10: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
cc20: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
cc30: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
cc40: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
cc50: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
cc60: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
cc70: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
cc80: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
cc90: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
cca0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
ccb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ccc0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
ccd0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
cce0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
ccf0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
cd00: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
cd10: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
cd20: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cd30: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cd40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cd50: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
cd60: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
cd70: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
cda0: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cdd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
cde0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
cdf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
ce00: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
ce10: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
ce20: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ce30: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
ce40: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
ce50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ce60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ce70: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
ce80: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
ce90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
cea0: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
ceb0: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75  be the offset ju
cec0: 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  st after the end
ced0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75   of the last jou
cee0: 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77  rnal.  ** page w
cef0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68  ritten before th
cf00: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
cf10: 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  header for this 
cf20: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
cf30: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77  ransaction was w
cf40: 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65  ritten, or the e
cf50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
cf60: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
cf70: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
cf80: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
cf90: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
cfa0: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
cfb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
cfc0: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
cfd0: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
cfe0: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
cff0: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
d000: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
d010: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
d020: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
d030: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
d040: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
d050: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
d060: 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  mtSize);.  asser
d070: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d080: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d090: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
d0a0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
d0b0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
d0c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d0d0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d0e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
d0f0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
d100: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
d110: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
d120: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
d130: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
d140: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
d150: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
d160: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
d170: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d180: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
d190: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
d1a0: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
d1b0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
d1c0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
d1d0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
d1e0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
d1f0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
d200: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
d210: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
d220: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d230: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
d240: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
d250: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
d260: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d270: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d280: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
d290: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
d2a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d2b0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
d2c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d2d0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d2e0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
d2f0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
d300: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
d310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d320: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
d330: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
d340: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
d350: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
d360: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d370: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
d380: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
d390: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
d3a0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
d3b0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
d3c0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d3d0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
d3e0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
d3f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
d400: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
d410: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
d420: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
d430: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
d440: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
d450: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
d460: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
d470: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
d480: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
d490: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
d4a0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
d4b0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d4c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d4d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
d4e0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d4f0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
d500: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d510: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
d520: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
d530: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
d540: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
d550: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
d560: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
d570: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
d580: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d590: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d5a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
d5b0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d5c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d5d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d5e0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
d5f0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d600: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
d610: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d620: 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
d630: 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
d640: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
d650: 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
d660: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
d670: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d680: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d690: 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
d6a0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
d6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d6c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d6d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d6e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
d6f0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d700: 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
d710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
d720: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
d730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
d740: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
d750: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
d760: 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
d770: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
d780: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
d790: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
d7a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d7b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d7c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d7d0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
d7e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d7f0: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
d800: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d810: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d820: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
d830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
d840: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
d850: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
d860: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
d870: 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
d880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d890: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
d8a0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
d8b0: 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
d8c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
d8e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
d8f0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
d900: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
d910: 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
d920: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
d930: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
d940: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
d950: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
d960: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
d970: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
d980: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
d990: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d9a0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
d9b0: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
d9c0: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
d9d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
d9e0: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
d9f0: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
da00: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
da10: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
da20: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
da30: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
da40: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
da50: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
da60: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
da70: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
da80: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
da90: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
daa0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
dab0: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
dac0: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
dad0: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
dae0: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
daf0: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
db00: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
db10: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
db20: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
db30: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
db40: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
db50: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
db60: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
db70: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
db80: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
db90: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
dba0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
dbb0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
dbc0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
dbd0: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
dbe0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
dbf0: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
dc00: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
dc10: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
dc20: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
dc30: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
dc40: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
dc50: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
dc60: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
dc70: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
dc80: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
dc90: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
dca0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
dcb0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
dcc0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
dcd0: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
dce0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
dcf0: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
dd00: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
dd10: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
dd20: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
dd30: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
dd40: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
dd50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
dd60: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
dd70: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
dd80: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
dd90: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
dda0: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
ddb0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
ddc0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
ddd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
dde0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
ddf0: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
de00: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
de10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
de20: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
de30: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
de40: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
de50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
de60: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
de70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
de80: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
de90: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
dea0: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
deb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
dec0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
ded0: 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
dee0: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
def0: 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
df00: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
df10: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
df20: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
df30: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
df40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
df50: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
df60: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
df70: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
df80: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
df90: 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66  ->full_fsync = f
dfa0: 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28  ull_fsync;.  if(
dfb0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
dfc0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
dfd0: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
dfe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
dff0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
e000: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
e010: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
e020: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
e030: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
e040: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
e050: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
e060: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
e070: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
e080: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
e090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
e0a0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
e0b0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
e0c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
e0d0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
e0e0: 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
e0f0: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
e100: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
e110: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
e120: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
e130: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
e140: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
e150: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
e160: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
e170: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
e180: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
e190: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
e1a0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
e1b0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
e1c0: 67 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69  gerOpentemp(OsFi
e1d0: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
e1e0: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
e1f0: 72 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65  rc;.  char zFile
e200: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
e210: 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20  _SIZE];..#ifdef 
e220: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
e230: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
e240: 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
e250: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
e260: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
e270: 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20  /.#endif.  do{. 
e280: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
e290: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
e2a0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
e2b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e2c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
e2d0: 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20  e, pFd, 1);.    
e2e0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e2f0: 54 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b  TE_OK || *pFd );
e300: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e310: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e320: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e330: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e350: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e360: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e370: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e380: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e390: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e3a0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e3b0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e3c0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e3d0: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e3e0: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e3f0: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e400: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e410: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e420: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e430: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e440: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e450: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e460: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e470: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e480: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e490: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e4a0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e4b0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e4c0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e4d0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e4e0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e4f0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e500: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e510: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e520: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e530: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e540: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e550: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e560: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e570: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e580: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e590: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
e5a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
e5b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e5c0: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
e5d0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
e5e0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
e5f0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
e600: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e610: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
e620: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
e630: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
e640: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
e650: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
e660: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
e670: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
e680: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
e690: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
e6c0: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
e6d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e6e0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
e6f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
e700: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
e710: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
e720: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
e730: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
e740: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
e750: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20  .  OsFile *fd = 
e760: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
e770: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
e780: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
e790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
e7a0: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
e7b0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
e7c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
e7d0: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
e7e0: 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
e7f0: 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
e800: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e810: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
e820: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
e830: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e840: 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  IZE];.#ifdef SQL
e850: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
e860: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
e870: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
e880: 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
e890: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
e8a0: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
e8b0: 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
e8c0: 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
e8d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
e8e0: 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
e8f0: 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
e900: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
e910: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
e920: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
e930: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
e940: 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
e950: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
e960: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
e970: 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f  an be set. It wo
e980: 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61  uld be nice to a
e990: 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20  ssert.  ** that 
e9a0: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
e9b0: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62  c is non-zero, b
e9c0: 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65  ut alas this bre
e9d0: 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a  aks test cases .
e9e0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
e9f0: 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72  invoke the pager
ea00: 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a   directly..  */.
ea10: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
ea20: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
ea30: 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
ea40: 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64  rt( pTsd );.#end
ea50: 69 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64  if..  /* We used
ea60: 20 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c   to test if mall
ea70: 6f 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79  oc() had already
ea80: 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70   failed before p
ea90: 72 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a  roceeding. .  **
eaa0: 20 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69   But the way thi
eab0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
eac0: 65 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61  ed in SQLite mea
ead0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65  ns that can neve
eae0: 72 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46  r.  ** happen. F
eaf0: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74  urthermore, if t
eb00: 68 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  he malloc-failed
eb10: 20 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79   flag is already
eb20: 20 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68   set, .  ** eith
eb30: 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
eb40: 71 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72  qliteStrDup() or
eb50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
eb60: 62 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20  below will.  ** 
eb70: 66 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64  fail shortly and
eb80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65   SQLITE_NOMEM re
eb90: 74 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20  turned anyway.. 
eba0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
ebb0: 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   0;..  /* Open t
ebc0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
ebd0: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
ebe0: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
ebf0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
ec00: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
ec10: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
ec20: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
ec30: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
ec40: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
ec50: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
ec60: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
ec70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec80: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
ec90: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
eca0: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
ecb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
ecc0: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
ecd0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
ece0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
ecf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
ed00: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
ed10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ed20: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ed30: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
ed40: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
ed50: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ed60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed70: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
ed80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
ed90: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
eda0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
edb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
edc0: 20 66 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20   fd );.      }. 
edd0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ede0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
edf0: 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29  gerOpentemp(&fd)
ee00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
ee10: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d  empFileName(zTem
ee20: 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  p);.    zFilenam
ee30: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
ee40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ee50: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ee60: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
ee70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ee80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ee90: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
eea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
eeb0: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
eec0: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
eed0: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
eee0: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
eef0: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
ef00: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
ef10: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
ef20: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
ef30: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
ef40: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
ef50: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
ef60: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
ef70: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
ef80: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
ef90: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
efa0: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
efb0: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
efc0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
efd0: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
efe0: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
eff0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
f000: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
f010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
f020: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
f030: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
f040: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
f050: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
f060: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
f070: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
f080: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
f090: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
f0a0: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
f0b0: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
f0c0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
f0d0: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
f0e0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f0f0: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
f100: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
f110: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
f120: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
f130: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f140: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
f150: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
f160: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
f170: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
f180: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
f190: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
f1a0: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
f1b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
f1c0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
f1d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f1e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f1f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f200: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
f210: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
f220: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
f230: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  M:rc);.  }..  PA
f240: 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20  GERTRACE3("OPEN 
f250: 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
f260: 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c  NDLEID(fd), zFul
f270: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f  lPathname);.  IO
f280: 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
f290: 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a  %s\n", pPager, z
f2a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20  FullPathname)). 
f2b0: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
f2c0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
f2d0: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
f2e0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
f2f0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f300: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
f310: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f320: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
f330: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
f340: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  ];.  memcpy(pPag
f350: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
f360: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61  FullPathname, na
f370: 6d 65 4c 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63  meLen+1);.  memc
f380: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
f390: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
f3a0: 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29  name, nameLen+1)
f3b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  ;..  for(i=nameL
f3c0: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
f3d0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
f3e0: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
f3f0: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
f400: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
f410: 2d 31 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70  -1] = 0;.  memcp
f420: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
f430: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
f440: 65 2c 6e 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71  e,nameLen);.  sq
f450: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f460: 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70  thname);.  memcp
f470: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f480: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f490: 6a 6f 75 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28  journal",sizeof(
f4a0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20  "-journal"));.  
f4b0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
f4c0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
f4d0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
f4e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
f4f0: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
f500: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
f510: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
f520: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
f530: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
f540: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
f550: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
f560: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
f570: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
f580: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
f590: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
f5a0: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
f5b0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
f5c0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
f5d0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
f5e0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f5f0: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
f600: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
f610: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f620: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
f630: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f640: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
f650: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
f660: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
f670: 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65  GE_COUNT;.  asse
f680: 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rt( PAGER_UNLOCK
f690: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ==0 );.  /* pPag
f6a0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
f6b0: 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
f6c0: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
f6d0: 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
f6e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
f6f0: 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
f700: 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
f710: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
f720: 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
f730: 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
f740: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f750: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
f760: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
f770: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
f780: 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
f790: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
f7a0: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
f7b0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
f7c0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f7d0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
f7e0: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f7f0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
f800: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
f810: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
f820: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
f830: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
f840: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
f850: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
f860: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
f870: 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
f880: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
f890: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
f8a0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
f8b0: 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
f8c0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
f8d0: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
f8e0: 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
f8f0: 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69  (fd||memDb);.  i
f900: 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
f910: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
f920: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
f930: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f940: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
f950: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
f960: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
f970: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
f980: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
f990: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
f9a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f9b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
f9c0: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
f9d0: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
f9e0: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
f9f0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
fa00: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
fa10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fa20: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
fa30: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
fa40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fa50: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
fa60: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
fa70: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
fa80: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
fa90: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
faa0: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
fab0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
fac0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
fad0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fae0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
faf0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
fb00: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
fb10: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
fb20: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
fb30: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
fb40: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
fb50: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
fb60: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
fb70: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
fb80: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
fb90: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
fba0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
fbb0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
fbc0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
fbd0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fbe0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
fbf0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
fc00: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
fc10: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f  PagerUnref()..*/
fc20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
fc30: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
fc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
fc50: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50  oid (*xDesc)(DbP
fc60: 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
fc70: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
fc80: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
fc90: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
fca0: 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
fcb0: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
fcc0: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
fcd0: 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
fce0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
fcf0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
fd00: 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
fd10: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
fd20: 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
fd30: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
fd40: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
fd50: 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
fd60: 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
fd70: 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
fd80: 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
fd90: 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
fda0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
fdb0: 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
fdc0: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
fdd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fde0: 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
fdf0: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fe00: 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c  Reinit)(DbPage*,
fe10: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
fe20: 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
fe30: 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
fe40: 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
fe50: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
fe60: 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20  w size.  If the 
fe70: 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
fe80: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70  .** size is inap
fe90: 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
fea0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
feb0: 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65  age size is sele
fec0: 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75  cted.** and retu
fed0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
fee0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fef0: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
ff00: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
ff10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
ff20: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
ff30: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
ff40: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
ff50: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
ff60: 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e  emDb && pPager->
ff70: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nRef==0 ){.    p
ff80: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
ff90: 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
ffa0: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
ffb0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
ffc0: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
ffd0: 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  ite3ReallocOrFre
ffe0: 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
fff0: 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ace, pageSize);.
10000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
10010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
10020 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
10030 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
10040 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
10050 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
10060 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
10070 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
10080 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
10090 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
100a0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
100b0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
100c0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
100d0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
100e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
100f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
10100 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
10110 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
10120 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
10130 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
10140 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
10150 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
10160 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
10170 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
10180 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
10190 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
101a0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
101b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
101c0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
101d0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
101e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
101f0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
10200 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
10210 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
10220 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
10230 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
10240 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
10250 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
10260 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
10270 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
10280 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
10290 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
102a0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
102b0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
102c0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
102d0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
102e0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
102f0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
10300 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
10310 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
10320 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
10330 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
10340 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
10350 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
10360 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
10370 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
10380 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10390 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
103a0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
103b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
103c0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
103d0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
103e0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
103f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10400 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
10410 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10420 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
10430 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
10440 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
10450 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10460 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
10470 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10480 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
10490 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
104a0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
104b0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
104c0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
104d0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
104e0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
104f0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
10500 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
10510 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
10520 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
10530 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
10540 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
10550 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
10560 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
10570 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
10580 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
10590 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
105a0 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
105b0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
105c0 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
105d0 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
105e0 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
105f0 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
10600 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
10610 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
10620 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
10630 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
10640 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
10650 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
10660 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
10670 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10680 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
10690 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
106a0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
106b0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
106c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
106d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
106e0 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d  , 0, N);.  if( M
106f0 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64  EMDB==0 ){.    d
10700 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10710 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10720 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
10730 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
10740 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
10750 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10760 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
10770 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
10780 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
10790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
107a0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
107b0 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20   pDest, N);.    
107c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
107d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
107e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
107f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
10800 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10820 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
10830 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
10840 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
10850 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
10860 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
10870 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
10880 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
10890 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
108b0 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
108c0 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
108d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
108e0 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
108f0 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
10900 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
10910 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
10920 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
10930 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
10940 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
10950 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
10960 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
10970 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
10980 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
10990 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
109a0 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e  ){.  i64 n;.  in
109b0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
109c0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
109d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
109e0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
109f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
10a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
10a10 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
10a20 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
10a30 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72  lse {.    if( (r
10a40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10a50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
10a60 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
10a70 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
10a80 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
10a90 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
10aa0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
10ab0 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
10ac0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
10ad0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
10ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
10af0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
10b00 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
10b10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
10b20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
10b30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
10b40 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
10b50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
10b60 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
10b70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
10b80 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
10b90 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78  if( n>pPager->mx
10ba0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
10bb0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a  er->mxPgno = n;.
10bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
10bd0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
10be0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10bf0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
10c00 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
10c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10c20 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
10c30 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
10c40 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
10c50 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
10c60 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
10c70 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
10c80 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
10c90 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
10ca0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
10cb0 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
10cc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
10cd0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
10ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
10cf0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
10d00 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
10d10 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
10d20 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
10d30 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
10d40 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
10d50 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
10d60 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
10d70 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
10d80 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
10d90 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
10da0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
10db0 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
10dc0 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
10dd0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
10de0 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
10df0 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
10e00 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
10e10 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
10e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10e30 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
10e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
10e50 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
10e60 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
10e70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10e80 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
10e90 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
10ea0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
10eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10ec0 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10ed0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10ee0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10ef0 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10f00 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10f10 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10f20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10f30 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
10f40 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10f50 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
10f60 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
10f70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10f80 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
10f90 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
10fa0 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
10fb0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
10fc0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
10fd0 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
10fe0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10ff0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
11000 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
11010 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11020 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
11030 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
11040 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
11050 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
11060 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
11070 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
11080 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
11090 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
110a0 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
110b0 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
110c0 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
110d0 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
110e0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
110f0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
11100 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11110 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
11120 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
11130 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
11140 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
11150 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
11160 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
11170 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
11180 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
11190 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
111a0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
111b0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
111c0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
111d0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
111e0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
111f0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
11200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
11210 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
11220 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
11230 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11240 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
11250 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
11260 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
11280 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11290 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
112a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
112b0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
112c0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
112d0 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
112e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
112f0 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11300 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
11310 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11320 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
11330 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
11340 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
11350 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
11360 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
11370 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
11380 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
11390 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
113a0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
113b0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
113c0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
113d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113e0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
113f0 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
11400 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
11410 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
11420 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
11430 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
11440 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
11450 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
11460 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
11470 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
11480 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
11490 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
114a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
114b0 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
114c0 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
114d0 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
114e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
114f0 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
11500 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
11510 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
11520 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
11530 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
11540 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
11550 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
11560 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
11570 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
11580 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
11590 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
115a0 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
115b0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
115c0 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
115d0 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
115e0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
115f0 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
11600 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
11610 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11620 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
11630 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
11640 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
11650 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
11660 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
11670 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
11680 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
11690 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
116a0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
116b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
116c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
116d0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
116e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
116f0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11700 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11710 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
11720 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11730 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
11740 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
11750 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
11760 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
11770 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
11780 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
11790 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
117a0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
117b0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
117d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
117e0 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
117f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11800 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
11810 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
11820 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
11830 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
11840 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
11850 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
11860 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
11870 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
11880 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
11890 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
118a0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
118b0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
118c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
118d0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
118e0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
118f0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
11900 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
11910 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
11920 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
11930 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
11940 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
11950 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
11960 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
11970 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
11980 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
11990 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
119a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
119b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
119c0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
119d0 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
119e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
119f0 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
11a00 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
11a10 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
11a20 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
11a30 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
11a40 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
11a50 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
11a60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11a70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11a80 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
11a90 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44  dbSize<0 || MEMD
11aa0 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  B );..  if( pPag
11ab0 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
11ac0 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
11ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
11ae0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
11af0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11b00 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
11b10 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
11b20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11b30 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
11b40 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11b50 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
11b60 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
11b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
11b90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
11ba0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
11bb0 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
11bc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
11bd0 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
11be0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
11c00 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
11c10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11c20 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
11c30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11c40 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11c50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
11c60 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
11c70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11c90 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
11ca0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
11cb0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
11cc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11cd0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
11ce0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
11cf0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
11d00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
11d10 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
11d20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
11d30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11d40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
11d50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
11d60 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11d70 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
11d80 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
11d90 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
11da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11db0 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
11dc0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11de0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11df0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
11e00 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
11e10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
11e20 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
11e30 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  ating. */.  rc =
11e40 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
11e50 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
11e60 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
11e70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11e90 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
11ea0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
11eb0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
11ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ed0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
11ee0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
11ef0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
11f00 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
11f10 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
11f20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
11f30 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
11f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11f50 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
11f60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
11f70 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
11f80 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
11f90 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
11fa0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
11fb0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
11fc0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
11fd0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
11fe0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
11ff0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
12000 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
12010 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
12020 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
12030 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
12040 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12050 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
12060 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
12070 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
12080 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
12090 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
120a0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
120b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
120c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
120d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
120e0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
120f0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
12100 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
12110 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
12120 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
12130 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
12140 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12150 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12160 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
12170 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
12180 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
12190 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
121a0 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
121b0 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
121c0 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
121d0 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
121e0 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
121f0 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
12200 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
12210 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
12220 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
12230 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
12240 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
12250 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
12260 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
12270 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
12280 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72   set..  */.  Thr
12290 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
122a0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
122b0 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
122c0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
122d0 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d  t( pTsd && pTsd-
122e0 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69  >nAlloc );.#endi
122f0 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  f..  disable_sim
12300 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
12310 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  ();.  pPager->er
12320 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61  rCode = 0;.  pPa
12330 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
12340 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f  de = 0;.  pager_
12350 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12360 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
12370 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
12380 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
12390 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
123a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
123b0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
123c0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
123d0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
123e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
123f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12400 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
12410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12420 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  en==0 && pPager-
12430 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b  >stmtOpen==0) );
12440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
12450 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
12460 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12470 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
12480 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
12490 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
124a0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
124b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
124c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
124d0 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
124e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
124f0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
12500 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
12510 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
12520 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12530 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
12540 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
12550 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
12560 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
12570 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
12580 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23  ;.  ** }.  */..#
12590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
125a0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
125b0 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
125c0 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d  e the pager from
125d0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
125e0 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74   of pagers start
125f0 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72  ing at .  ** Thr
12600 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69  eadData.pPager i
12610 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
12620 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ent is enabled..
12630 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
12640 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20  r==pTsd->pPager 
12650 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61  ){.    pTsd->pPa
12660 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ger = pPager->pN
12670 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
12680 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20    Pager *pTmp;. 
12690 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54     for(pTmp = pT
126a0 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70  sd->pPager; pTmp
126b0 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b  ->pNext!=pPager;
126c0 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
126d0 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70  t){}.    pTmp->p
126e0 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
126f0 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
12700 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12710 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
12720 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12730 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
12740 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12750 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
12760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
12770 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
12780 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
12790 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
127a0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
127b0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
127c0 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
127d0 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
127e0 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
127f0 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
12800 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
12810 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
12820 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
12830 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
12840 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12850 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
12860 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
12870 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12880 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
12890 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
128a0 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
128b0 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
128c0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
128d0 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
128e0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
128f0 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
12900 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
12910 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
12920 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
12930 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
12940 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
12950 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
12960 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
12970 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
12980 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
12990 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
129a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
129b0 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
129c0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
129d0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
129e0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
129f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12a00 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
12a10 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
12a20 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
12a30 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12a40 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
12a50 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
12a60 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
12a70 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
12a80 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
12a90 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
12aa0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12ab0 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
12ac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12ad0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
12ae0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
12af0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
12b00 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12b10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12b20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12b30 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
12b40 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
12b50 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
12b60 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
12b70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
12b80 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
12b90 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
12ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12bb0 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
12bc0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
12bd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
12be0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
12bf0 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
12c00 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
12c10 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
12c20 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
12c30 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
12c40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
12c50 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
12c60 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
12c70 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
12c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12c90 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
12ca0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
12cb0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
12cc0 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
12cd0 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
12ce0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
12cf0 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
12d00 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12d10 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
12d20 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12d30 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
12d40 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
12d50 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
12d60 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
12d70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12d80 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
12d90 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66  pPg){.  page_ref
12da0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12dc0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
12dd0 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
12de0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
12df0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
12e00 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
12e10 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12e20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
12e30 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
12e40 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
12e50 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
12e60 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
12e70 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
12e80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
12e90 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
12ea0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
12eb0 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
12ec0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12ed0 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
12ee0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
12ef0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12f00 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
12f10 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
12f20 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
12f30 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
12f40 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
12f50 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
12f60 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
12f70 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
12f80 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
12f90 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
12fa0 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
12fb0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12fc0 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12fd0 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12fe0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12ff0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
13000 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
13010 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
13020 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
13030 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
13040 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
13050 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
13060 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
13070 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
13080 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
13090 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
130a0 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
130b0 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
130c0 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
130d0 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
130e0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
130f0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
13100 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
13110 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
13120 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
13130 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
13140 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
13150 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
13160 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
13170 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
13180 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
13190 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
131a0 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
131b0 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
131c0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
131d0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
131e0 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
131f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
13200 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
13210 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
13220 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13230 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
13240 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
13250 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
13260 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
13270 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
13280 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
13290 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
132a0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
132b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
132c0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
132d0 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
132e0 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
132f0 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
13300 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
13310 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
13320 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
13330 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
13340 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
13350 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
13360 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
13370 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
13380 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13390 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
133a0 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
133b0 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
133c0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
133d0 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
133e0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
133f0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
13400 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
13410 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
13420 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
13430 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
13440 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
13450 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
13460 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13470 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
13480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13490 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
134a0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
134b0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
134c0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
134d0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
134e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
134f0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
13500 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
13510 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
13520 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13530 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
13540 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
13550 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
13560 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
13570 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
13580 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
13590 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
135a0 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
135b0 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
135c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
135d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
135e0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
135f0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
13600 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
13610 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13620 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
13630 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
13640 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
13650 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
13660 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
13670 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
13680 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
13690 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
136a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
136b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
136c0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
136d0 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
136e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
136f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13700 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13710 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
13720 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13730 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13740 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
13750 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
13760 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
13770 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13780 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
13790 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
137a0 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20  c), 4)).        
137b0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
137c0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
137d0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
137e0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
137f0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
13800 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13810 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
13820 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
13830 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
13840 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13850 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
13860 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
13870 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
13880 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13890 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
138a0 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
138b0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
138c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
138d0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
138e0 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
138f0 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
13900 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13910 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
13920 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13930 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
13940 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13950 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
13960 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
13970 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
13980 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
13990 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
139a0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
139b0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
139c0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
139d0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
139e0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
139f0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
13a00 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
13a10 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13a20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
13a30 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
13a40 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
13a50 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
13a60 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
13a70 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
13a80 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
13a90 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
13aa0 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
13ab0 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
13ac0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
13ad0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13ae0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13af0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
13b00 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
13b10 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
13b20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13b30 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
13b40 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
13b50 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13b70 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
13b80 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
13b90 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
13ba0 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
13bb0 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
13bc0 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
13bd0 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
13be0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
13bf0 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
13c00 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
13c10 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
13c20 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
13c30 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
13c40 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
13c50 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
13c60 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
13c70 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
13c80 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
13c90 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13ca0 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
13cb0 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13cd0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13ce0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13cf0 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13d00 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13d10 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13d20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13d30 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13d40 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
13d50 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
13d60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
13d70 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
13d80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
13d90 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
13da0 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
13db0 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13dc0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13dd0 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13de0 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13df0 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13e00 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13e10 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13e20 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13e30 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13e40 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13e50 55 43 4b 45 54 5f 41 4c 4c 4f 43 20 32 35 0a 23  UCKET_ALLOC 25.#
13e60 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55  define N_SORT_BU
13e70 43 4b 45 54 20 20 20 20 20 20 20 32 35 0a 23 69  CKET       25.#i
13e80 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
13e90 0a 20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  .  int sqlite3_p
13ea0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
13eb0 65 74 20 3d 20 30 3b 0a 20 20 23 75 6e 64 65 66  et = 0;.  #undef
13ec0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 0a 20   N_SORT_BUCKET. 
13ed0 20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f   #define N_SORT_
13ee0 42 55 43 4b 45 54 20 5c 0a 20 20 20 28 73 71 6c  BUCKET \.   (sql
13ef0 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
13f00 74 5f 62 75 63 6b 65 74 3f 73 71 6c 69 74 65 33  t_bucket?sqlite3
13f10 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
13f20 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b  cket:N_SORT_BUCK
13f30 45 54 5f 41 4c 4c 4f 43 29 0a 23 65 6e 64 69 66  ET_ALLOC).#endif
13f40 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 73  .static PgHdr *s
13f50 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ort_pagelist(PgH
13f60 64 72 20 2a 70 49 6e 29 7b 0a 20 20 50 67 48 64  dr *pIn){.  PgHd
13f70 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b  r *a[N_SORT_BUCK
13f80 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20  ET_ALLOC], *p;. 
13f90 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13fa0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13fb0 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13fc0 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13fd0 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13fe0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13ff0 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
14000 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
14010 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
14020 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
14030 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
14040 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
14050 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
14060 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
14070 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
14080 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
14090 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
140a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
140b0 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
140c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 6f 76   ){.      /* Cov
140d0 65 72 61 67 65 3a 20 54 6f 20 67 65 74 20 68 65  erage: To get he
140e0 72 65 2c 20 74 68 65 72 65 20 6e 65 65 64 20 74  re, there need t
140f0 6f 20 62 65 20 32 5e 28 4e 5f 53 4f 52 54 5f 42  o be 2^(N_SORT_B
14100 55 43 4b 45 54 29 20 0a 20 20 20 20 20 20 2a 2a  UCKET) .      **
14110 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
14120 20 69 6e 70 75 74 20 6c 69 73 74 2e 20 54 68 69   input list. Thi
14130 73 20 69 73 20 70 6f 73 73 69 62 6c 65 2c 20 62  s is possible, b
14140 75 74 20 69 6d 70 72 61 63 74 69 63 61 6c 2e 0a  ut impractical..
14150 20 20 20 20 20 20 2a 2a 20 54 65 73 74 69 6e 67        ** Testing
14160 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 74 68   this line is th
14170 65 20 70 6f 69 6e 74 20 6f 66 20 67 6c 6f 62 61  e point of globa
14180 6c 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 20  l variable.     
14190 20 2a 2a 20 73 71 6c 69 74 65 33 5f 70 61 67 65   ** sqlite3_page
141a0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 2e  r_n_sort_bucket.
141b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
141c0 61 5b 69 5d 20 3d 20 6d 65 72 67 65 5f 70 61 67  a[i] = merge_pag
141d0 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
141e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 20 3d 20      }.  }.  p = 
141f0 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  a[0];.  for(i=1;
14200 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
14210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20  ; i++){.    p = 
14220 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 70  merge_pagelist(p
14230 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  , a[i]);.  }.  r
14240 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
14250 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
14260 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
14270 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
14280 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
14290 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
142a0 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
142b0 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
142c0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
142d0 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
142e0 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
142f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
14300 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
14310 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
14320 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
14330 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
14340 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
14350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
14360 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
14370 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
14380 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
14390 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
143a0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
143b0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
143c0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
143d0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
143e0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
143f0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
14400 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
14410 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
14420 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
14430 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
14440 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
14450 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
14460 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
14470 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
14480 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
14490 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
144a0 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
144b0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
144c0 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
144d0 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
144e0 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
144f0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
14500 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
14510 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
14520 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
14530 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
14540 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
14550 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
14560 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
14570 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
14580 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
14590 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
145a0 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
145b0 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
145c0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
145d0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
145e0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
145f0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
14600 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
14610 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
14620 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
14630 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
14640 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
14650 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
14660 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
14670 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
14680 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
14690 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
146a0 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
146b0 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
146c0 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
146d0 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
146e0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
146f0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
14700 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
14710 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
14720 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14730 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
14740 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 20 3d  ;.  }..  pList =
14750 20 73 6f 72 74 5f 70 61 67 65 6c 69 73 74 28 70   sort_pagelist(p
14760 4c 69 73 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  List);.  while( 
14770 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
14780 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
14790 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  y );.    rc = sq
147a0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
147b0 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e  er->fd, (pList->
147c0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
147d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
147e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
147f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a 20 49  urn rc;.    /* I
14800 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
14810 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
14820 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
14830 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
14840 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
14850 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
14860 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
14870 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 29 20  PagerTruncate() 
14880 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
14890 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
148a0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
148b0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
148c0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
148d0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
148e0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
148f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
14900 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73   */.    if( pLis
14910 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  t->pgno<=pPager-
14920 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
14930 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43   char *pData = C
14940 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47  ODEC2(pPager, PG
14950 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
14960 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
14970 20 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52   6);.      PAGER
14980 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64  TRACE3("STORE %d
14990 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
149a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
149b0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
149c0 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
149d0 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
149e0 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
149f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
14a00 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
14a10 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
14a20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14a30 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
14a40 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
14a50 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
14a60 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
14a70 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
14a80 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
14a90 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
14aa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
14ab0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
14ac0 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
14ad0 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
14ae0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
14af0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
14b00 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
14b10 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
14b20 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
14b30 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
14b40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
14b50 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
14b60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
14b70 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14b80 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
14b90 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
14ba0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
14bb0 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
14bc0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
14bd0 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
14be0 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
14bf0 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
14c00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
14c10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14c20 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
14c30 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
14c40 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
14c50 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
14c60 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
14c70 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
14c80 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
14c90 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
14ca0 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
14cb0 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
14cc0 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
14cd0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
14ce0 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
14cf0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
14d00 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a  ager->pDirty;.}.
14d10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
14d20 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61  UE if there is a
14d30 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
14d40 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
14d50 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
14d60 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
14d70 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
14d80 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
14d90 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
14da0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14db0 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
14dc0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
14dd0 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
14de0 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
14df0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
14e00 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
14e10 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
14e20 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
14e30 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
14e40 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
14e50 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
14e60 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
14e70 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
14e80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14e90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14ea0 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  ( !sqlite3OsFile
14eb0 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
14ec0 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
14ed0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14ee0 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65  if( sqlite3OsChe
14ef0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
14f00 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
14f10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
14f20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
14f30 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
14f40 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
14f50 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
14f60 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
14f70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14f80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
14f90 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
14fa0 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
14fb0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
14fc0 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
14fd0 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
14fe0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
14ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15000 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
15010 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
15020 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
15030 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
15040 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
15050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15060 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
15070 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
15080 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
15090 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
150a0 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
150b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45  0;..  assert(!ME
150c0 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  MDB);..  /* Find
150d0 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
150e0 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
150f0 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
15100 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
15110 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
15120 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
15130 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
15140 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
15150 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f  irstSynced;..  /
15160 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
15170 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
15180 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
15190 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
151a0 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
151b0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
151c0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
151d0 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
151e0 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
151f0 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
15200 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
15210 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
15220 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61  times.  ** it ca
15230 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
15240 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30   */.  if( pPg==0
15250 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
15260 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20  st && syncOk && 
15270 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74  !MEMDB){.    int
15280 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
15290 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
152a0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
152b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
152c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
152d0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
152e0 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
152f0 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
15300 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
15310 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
15320 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  e.      ** journ
15330 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  al file. This is
15340 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65   done to avoid e
15350 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ver modifying a 
15360 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
15370 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20   header that is 
15380 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
15390 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65  rollback of page
153a0 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
153b0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
153c0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
153d0 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
153e0 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
153f0 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65  .      ** trashe
15400 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20  d when the nRec 
15410 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
15420 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
15430 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
15440 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
15450 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
15460 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
15470 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15480 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
15490 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
154a0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
154b0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
154c0 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
154d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
154e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
154f0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
15500 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  st;.  }.  if( pP
15510 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
15520 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15530 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
15540 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
15550 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
15560 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
15570 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
15580 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
15590 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
155a0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
155b0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
155c0 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
155d0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
155e0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
155f0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
15600 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
15610 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
15620 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
15630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
15650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15660 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
15670 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
15680 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
15690 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
156a0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
156b0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
156c0 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
156d0 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
156e0 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
156f0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
15700 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
15710 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
15720 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
15730 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
15740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
15750 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
15760 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
15770 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
15780 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
15790 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
157a0 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
157b0 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
157c0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
157d0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
157e0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
157f0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
15800 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
15810 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
15820 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
15830 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
15840 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
15850 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
15860 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
15870 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
15880 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
15890 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
158a0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
158b0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
158c0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
158d0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
158e0 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
158f0 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
15900 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
15910 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
15920 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
15930 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
15940 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
15950 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15960 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
15970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
15980 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
15990 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
159a0 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
159b0 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
159c0 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
159d0 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
159e0 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
159f0 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
15a00 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
15a10 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
15a20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
15a30 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
15a40 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
15a50 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
15a60 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
15a70 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
15a80 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
15a90 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
15aa0 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
15ab0 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
15ac0 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
15ad0 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
15ae0 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
15af0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
15b00 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
15b10 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
15b20 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
15b30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
15b40 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
15b50 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
15b60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15b70 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73  IT_DISKIO).int s
15b80 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61  qlite3PagerRelea
15b90 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65  seMemory(int nRe
15ba0 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  q){.  const Thre
15bb0 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d  adData *pTsdro =
15bc0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
15bd0 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
15be0 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
15bf0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
15c00 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f  * If the the glo
15c10 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c  bal mutex is hel
15c20 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  d, this subrouti
15c30 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a  ne becomes a.  *
15c40 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74  * o-op; zero byt
15c50 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  es of memory are
15c60 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73   freed.  This is
15c70 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f   because.  ** so
15c80 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
15c90 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
15ca0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
15cb0 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
15cc0 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72  ain the mutex, r
15cd0 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65  esulting in a de
15ce0 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  adlock..  */.  i
15cf0 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  f( sqlite3OsInMu
15d00 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65  tex(0) ){.    re
15d10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
15d20 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
15d30 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
15d40 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
15d50 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
15d60 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
15d70 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
15d80 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
15d90 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
15da0 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
15db0 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
15dc0 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
15dd0 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
15de0 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
15df0 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
15e00 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
15e10 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
15e20 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
15e30 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
15e40 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
15e50 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
15e60 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
15e70 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
15e80 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
15e90 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
15ea0 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
15eb0 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
15ec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15ed0 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a  pTsdro->pPager;.
15ee0 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65      for( ; pPage
15ef0 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20  r && (nReq<0 || 
15f00 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b  nReleased<nReq);
15f10 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
15f20 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67  pNext){.      Pg
15f30 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
15f40 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69  int rc;..      i
15f50 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15f60 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
15f70 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
15f80 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
15f90 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
15fa0 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
15fb0 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
15fc0 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
15fd0 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
15fe0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
15ff0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
16000 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
16010 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
16020 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
16030 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
16040 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
16050 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
16060 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
16070 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
16080 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
16090 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
160a0 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
160b0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
160c0 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
160d0 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
160e0 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
160f0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
16100 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
16110 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
16120 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
16130 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
16140 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
16150 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
16160 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
16170 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
16180 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
16190 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
161a0 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
161b0 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
161c0 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
161d0 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
161e0 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
161f0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
16200 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
16210 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
16220 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
16230 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
16240 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
16250 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
16260 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
16270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16280 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67    for( pTmp=pPag
16290 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  er->pAll; pTmp->
162a0 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
162b0 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
162c0 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
162d0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
162e0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
162f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16300 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
16310 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
16320 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  pPg);.        IO
16330 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
16340 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
16350 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
16360 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
16370 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
16380 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
16390 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
163a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
163b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
163c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
163d0 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
163e0 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
163f0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
16400 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
16410 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
16420 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
16430 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
16440 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
16450 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
16460 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
16470 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
16480 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
16490 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
164a0 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
164b0 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
164c0 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
164d0 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
164e0 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
164f0 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
16500 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
16510 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
16520 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
16530 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
16540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16550 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66  assert( (rc&0xff
16560 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
16570 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
16580 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
16590 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
165a0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
165b0 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
165c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
165d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
165e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
165f0 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
16600 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16610 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
16620 4d 41 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53  MANAGEMENT && !S
16630 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
16640 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  O */../*.** Read
16650 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16660 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
16670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16680 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16690 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
166a0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
166b0 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
166c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
166d0 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
166e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
166f0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
16700 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
16710 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
16720 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
16730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16740 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
16750 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
16760 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16770 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
16790 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
167a0 20 20 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52    }.  PAGER_INCR
167b0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
167c0 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
167d0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
167e0 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
167f0 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
16800 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
16810 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41  no));.  PAGERTRA
16820 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61  CE3("FETCH %d pa
16830 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
16840 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
16850 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e  pgno);.  if( pgn
16860 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  o==1 ){.    memc
16870 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
16880 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50  leVers, &((u8*)P
16890 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
168a0 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  ))[24],.        
168b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
168e0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
168f0 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
16900 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
16910 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
16920 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74  >pgno, 3);.  ret
16930 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
16940 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16950 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
16960 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
16970 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
16980 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
16990 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
169a0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
169b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
169c0 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
169d0 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
169e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
169f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
16a00 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
16a10 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
16a20 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
16a30 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
16a40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
16a50 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
16a60 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
16a70 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
16a80 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
16a90 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
16aa0 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
16ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16ac0 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
16ad0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16ae0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16af0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
16b00 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
16b10 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  LOCK ){.    if( 
16b20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
16b30 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16b40 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  nRef==0 );.     
16b50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
16b60 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
16b70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
16b80 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
16b90 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
16ba0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16bc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16bd0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16be0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
16bf0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
16c00 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
16c10 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
16c20 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
16c30 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
16c40 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
16c50 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
16c60 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
16c70 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
16c80 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
16c90 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
16ca0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
16cb0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
16cc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
16cd0 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  ( hasHotJournal(
16ce0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
16cf0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
16d00 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
16d10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16d20 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
16d30 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
16d40 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
16d50 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
16d60 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
16d70 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
16d80 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43  e.        ** EXC
16d90 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
16da0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
16db0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
16dc0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  pen the.        
16dd0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16de0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
16df0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
16e00 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
16e10 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
16e20 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
16e30 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
16e40 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
16e50 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
16e60 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
16e70 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
16e80 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
16e90 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
16ea0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
16eb0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
16ec0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  he.        ** se
16ed0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
16ee0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
16ef0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
16f00 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
16f10 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
16f20 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
16f30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
16f40 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
16f50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
16f60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
16f70 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  k(pPager->fd, EX
16f80 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
16f90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
16fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16fb0 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
16fc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
16fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
16fe0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
16ff0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
17000 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17010 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
17020 43 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20  CLUSIVE;. .     
17030 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
17040 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
17050 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
17060 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
17070 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72          ** we ar
17080 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
17090 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
170a0 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  e. .        **. 
170b0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
170c0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
170d0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
170e0 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
170f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
17100 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
17110 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
17120 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
17130 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
17140 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
17150 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
17160 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
17170 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
17180 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
17190 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
171a0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
171b0 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
171c0 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e       **..** Open
171d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
171e0 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
171f0 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
17200 75 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c  use in ..** excl
17210 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
17220 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
17230 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65  iptor will be ke
17240 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20  pt open and.    
17250 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
17260 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
17270 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
17280 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
17290 2c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  , the.        **
172a0 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61   OsTruncate() ca
172b0 6c 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75  ll used in exclu
172c0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
172d0 20 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20   also requires. 
172e0 20 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64         ** a read
172f0 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64  /write file hand
17300 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
17310 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
17320 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
17330 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
17340 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
17350 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  >zJournal) ){.  
17360 20 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a          int ro;.
17370 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
17380 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
17390 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ile );.         
173a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
173b0 70 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61  penReadWrite(pPa
173c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
173d0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f  pPager->jfd, &ro
173e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
173f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
17400 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
17410 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  d );.          i
17420 66 28 20 72 6f 20 29 7b 0a 20 20 20 20 20 20 20  f( ro ){.       
17430 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17440 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20  _BUSY;.         
17450 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
17460 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
17470 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
17490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
174a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
174b0 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
174c0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
174d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
174e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
174f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17500 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
17510 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17520 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
17530 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17540 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17550 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
17560 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
17570 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17580 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
17590 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61   .        /* Pla
175a0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
175b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
175c0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
175d0 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
175e0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
175f0 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
17600 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
17610 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
17620 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
17630 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 1);.        i
17640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17660 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
17670 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
17680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17690 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73  assert(pPager->s
176a0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
176b0 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ED || .         
176c0 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c     (pPager->excl
176d0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
176e0 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
176f0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
17700 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
17710 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
17720 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  All ){.        /
17730 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
17740 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
17750 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
17760 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
17770 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
17780 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
17790 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
177a0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
177b0 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  us.        ** re
177c0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
177d0 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
177e0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
177f0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
17800 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
17810 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
17820 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
17830 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
17840 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
17850 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
17860 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
17870 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
17880 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
17890 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
178a0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
178b0 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
178c0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
178d0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
178e0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
178f0 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
17900 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
17910 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
17920 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
17930 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
17940 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
17950 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
17960 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
17970 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  e when.        *
17980 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
17990 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  use..        ** 
179a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72  .        ** Ther
179b0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
179c0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
179d0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
179e0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
179f0 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
17a00 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
17a10 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
17a20 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
17a30 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
17a40 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
17a50 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
17a60 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46          char dbF
17a70 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
17a80 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
17a90 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s)];.        sql
17aa0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17ab0 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  nt(pPager);..   
17ac0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
17ad0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
17ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61        return pPa
17af0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17b00 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
17b10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17b20 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
17b30 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
17b40 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
17b50 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
17b60 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
17b70 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17b80 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
17b90 3e 66 64 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  >fd, 24);.      
17ba0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17bb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17bc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17be0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17bf0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
17c00 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
17c10 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17c20 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ers));.         
17c30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17c40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17c50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17c60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17c80 20 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56    memset(dbFileV
17c90 65 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ers, 0, sizeof(d
17ca0 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
17cb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17cc0 69 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65  if( memcmp(pPage
17cd0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
17ce0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
17cf0 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d  f(dbFileVers))!=
17d00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
17d10 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17d20 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
17d30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17d40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17d50 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
17d60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
17d70 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
17d80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17d90 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17da0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
17db0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
17dc0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
17dd0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
17de0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  c;.}../*.** Allo
17df0 63 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a  cate a PgHdr obj
17e00 65 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72  ect.   Either cr
17e10 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f  eate a new one o
17e20 72 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78  r reuse.** an ex
17e30 69 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20  isting one that 
17e40 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
17e50 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41   in use..**.** A
17e60 20 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63   new PgHdr struc
17e70 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
17e80 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
17e90 6c 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74  llowing are.** t
17ea0 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  rue:.**.**     (
17eb0 31 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20  1)  We have not 
17ec0 65 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78  exceeded our max
17ed0 69 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63  imum allocated c
17ee0 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20  ache size.**    
17ef0 20 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20        as set by 
17f00 74 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68  the "PRAGMA cach
17f10 65 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e  e_size" command.
17f20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20  .**.**     (2)  
17f30 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75  There are no unu
17f40 73 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74  sed PgHdr object
17f50 73 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74  s available at t
17f60 68 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  his time..**.** 
17f70 20 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73      (3)  This is
17f80 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
17f90 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
17fa0 20 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65    (4)  There are
17fb0 20 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74   no PgHdr object
17fc0 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  s that do not re
17fd0 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a  quire a journal.
17fe0 2a 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  **          file
17ff0 20 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63   sync and a sync
18000 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
18010 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c  file is currentl
18020 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72  y.**          pr
18030 6f 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ohibited..**.** 
18040 4f 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65  Otherwise, reuse
18050 20 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48   an existing PgH
18060 64 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  dr.  In other wo
18070 72 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a  rds, reuse an.**
18080 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20   existing PgHdr 
18090 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
180a0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
180b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
180c0 20 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64   We have reached
180d0 20 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65   or exceeded the
180e0 20 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73   maximum cache s
180f0 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
18100 61 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47  allowed by "PRAG
18110 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a  MA cache_size"..
18120 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
18130 68 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20  here is a PgHdr 
18140 61 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50  available with P
18150 67 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a  gHdr->nRef==0.**
18160 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20  .**     (3)  We 
18170 61 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e  are not in an in
18180 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
18190 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
181a0 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20  Either there is 
181b0 61 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48  an available PgH
181c0 64 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  dr that does not
181d0 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20   need.**        
181e0 20 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74    to be synced t
181f0 6f 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64  o disk or else d
18200 69 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63  isk syncing is c
18210 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
18220 20 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f       allowed..*/
18230 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
18240 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61  rAllocatePage(Pa
18250 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
18260 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e  dr **ppPg){.  in
18270 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
18280 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
18290 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e  .  /* Create a n
182a0 65 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20  ew PgHdr if any 
182b0 6f 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64  of the four cond
182c0 69 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a  itions defined .
182d0 20 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65    ** above is me
182e0 74 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  t: */.  if( pPag
182f0 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72  er->nPage<pPager
18300 2d 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70  ->mxPage.   || p
18310 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30  Pager->pFirst==0
18320 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20   .   || MEMDB.  
18330 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69   || (pPager->pFi
18340 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20  rstSynced==0 && 
18350 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
18360 63 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  c).  ){.    if( 
18370 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70  pPager->nPage>=p
18380 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a  Pager->nHash ){.
18390 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69        pager_resi
183a0 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50  ze_hash_table(pP
183b0 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70  ager,.         p
183c0 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36  Pager->nHash<256
183d0 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d   ? 256 : pPager-
183e0 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20  >nHash*2);.     
183f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61   if( pPager->nHa
18400 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sh==0 ){.       
18410 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18420 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
18430 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
18440 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
18450 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c   }.    pPg = sql
18460 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
18470 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
18480 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20  ger->pageSize.  
18490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184a0 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
184b0 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
184c0 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
184f0 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
18500 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30  ;.    if( pPg==0
18510 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18530 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
18540 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
18550 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67  }.    memset(pPg
18560 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
18570 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
18580 42 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  B ){.      memse
18590 74 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  t(PGHDR_TO_HIST(
185a0 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
185b0 20 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72   sizeof(PgHistor
185c0 79 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  y));.    }.    p
185d0 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  Pg->pPager = pPa
185e0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
185f0 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
18600 3e 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  >pAll;.    pPage
18610 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
18620 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
18630 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
18640 20 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65   /* Recycle an e
18650 78 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74  xisting page wit
18660 68 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75  h a zero ref-cou
18670 6e 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  nt. */.    rc = 
18680 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50  pager_recycle(pP
18690 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a  ager, 1, &pPg);.
186a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
186b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
186c0 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
186d0 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
186e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
186f0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
18700 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
18710 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
18720 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
18730 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
18740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18750 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
18760 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
18770 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
18780 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
18790 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
187a0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
187b0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
187c0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
187d0 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
187e0 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
187f0 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
18800 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
18810 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
18820 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
18830 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
18840 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
18850 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
18860 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
18870 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
18880 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
18890 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
188a0 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
188b0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
188c0 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  Read ){.    int 
188d0 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
188e0 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
188f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
18900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
18920 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
18930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18940 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18950 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
18960 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
18970 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
18980 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
18990 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
189a0 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
189b0 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
189c0 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
189d0 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
189e0 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
189f0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
18a00 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
18a10 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18a20 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
18a30 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
18a40 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
18a50 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
18a60 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
18a70 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
18a80 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
18a90 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
18aa0 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
18ab0 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
18ac0 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
18ad0 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
18ae0 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
18af0 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
18b00 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
18b10 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
18b20 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
18b30 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
18b40 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
18b50 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
18b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
18b70 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
18b80 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
18b90 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
18ba0 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
18bb0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
18bc0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
18bd0 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
18be0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
18bf0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
18c00 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
18c10 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
18c20 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
18c30 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
18c40 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
18c50 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
18c60 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
18c70 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
18c80 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
18c90 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
18ca0 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
18cb0 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
18cc0 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
18cd0 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
18ce0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
18cf0 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
18d00 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18d10 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
18d20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
18d30 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
18d40 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
18d50 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
18d60 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
18d70 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
18d80 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
18d90 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
18da0 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
18db0 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
18dc0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
18dd0 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
18de0 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
18df0 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
18e00 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
18e10 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
18e20 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
18e30 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
18e40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
18e50 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
18e60 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
18e70 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
18e80 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
18e90 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
18ea0 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
18eb0 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
18ec0 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
18ed0 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
18ee0 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
18ef0 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
18f00 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
18f10 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
18f20 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18f30 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
18f40 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
18f50 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
18f60 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
18f70 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
18f80 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
18f90 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
18fa0 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
18fb0 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
18fc0 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
18fd0 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69  that point..*/.i
18fe0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41  nt sqlite3PagerA
18ff0 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
19000 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
19010 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
19020 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
19030 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
19040 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
19050 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
19060 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
19070 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
19080 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
19090 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
190a0 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
190b0 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
190c0 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
190d0 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
190e0 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
190f0 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
19100 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
19110 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19120 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19130 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
19140 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
19150 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
19160 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
19170 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
19180 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19190 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
191a0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
191b0 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
191c0 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
191d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
191e0 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
191f0 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
19200 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
19210 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
19220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19230 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
19240 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
19250 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
19260 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
19270 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
19280 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
19290 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
192a0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
192b0 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
192c0 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
192d0 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
192e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
192f0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
19300 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
19310 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
19320 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
19330 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
19340 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19350 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
19360 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
19370 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
19380 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
19390 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
193a0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
193b0 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
193c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
193d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
193e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
193f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
19400 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
19410 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70  CK );..  pPg = p
19420 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
19430 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
19440 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
19450 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
19460 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
19470 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
19480 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
19490 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50      int h;.    P
194a0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
194b0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63  ->nMiss);.    rc
194c0 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65   = pagerAllocate
194d0 50 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  Page(pPager, &pP
194e0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
194f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19500 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19510 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67    }..    pPg->pg
19520 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61  no = pgno;.    a
19530 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c  ssert( !MEMDB ||
19540 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74   pgno>pPager->st
19550 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  mtSize );.    if
19560 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
19570 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
19580 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
19590 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
195a0 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
195b0 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
195c0 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
195d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
195e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
195f0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
19600 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
19610 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
19620 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
19630 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
19640 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
19650 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
19660 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
19670 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
19680 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
19690 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61  0;.    }..    ma
196a0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
196b0 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
196c0 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
196d0 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
196e0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
196f0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
19700 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
19710 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
19720 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
19730 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
19740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
19750 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
19760 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
19770 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
19780 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
19790 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
197a0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
197b0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
197c0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
197d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
197e0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
197f0 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
19800 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
19810 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
19820 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
19830 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
19840 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
19850 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
19860 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  /.    if( nMax<(
19870 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
19880 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20  B || (noContent 
19890 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
198a0 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20  ysRollback) ){. 
198b0 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50       if( pgno>pP
198c0 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a  ager->mxPgno ){.
198d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
198e0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
198f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
19900 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
19910 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
19920 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
19930 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
19940 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
19950 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
19960 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70   noContent && !p
19970 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
19980 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54  lback;.      IOT
19990 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25  RACE(("ZERO %p %
199a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
199b0 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  no));.    }else{
199c0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64  .      rc = read
199d0 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70  DbPage(pPager, p
199e0 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg, pgno);.     
199f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19a00 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
19a10 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
19a20 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  D ){.        pPg
19a30 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20  ->pgno = 0;.    
19a40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
19a50 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
19a60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19a70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
19a80 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
19a90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69      }..    /* Li
19aa0 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  nk the page into
19ab0 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74   the page hash t
19ac0 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20  able */.    h = 
19ad0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
19ae0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73  nHash-1);.    as
19af0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
19b00 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
19b10 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
19b20 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
19b30 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
19b40 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
19b50 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
19b60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
19b70 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
19b80 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
19b90 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
19ba0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
19bb0 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  g;.    }..#ifdef
19bc0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
19bd0 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
19be0 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
19bf0 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
19c00 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
19c10 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
19c20 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65  d page is in the
19c30 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
19c40 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65      assert(pPage
19c50 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e  r->nRef>0 || pgn
19c60 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52  o==1);.    PAGER
19c70 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
19c80 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f  it);.    if( !no
19c90 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
19ca0 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
19cb0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
19cc0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
19cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19ce0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19cf0 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
19d00 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
19d10 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
19d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19d30 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
19d40 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
19d50 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
19d60 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
19d70 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
19d80 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
19d90 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
19da0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
19db0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
19dc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
19dd0 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
19de0 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
19df0 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
19e00 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
19e10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
19e20 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
19e30 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
19e40 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
19e50 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
19e60 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
19e70 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
19e80 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
19e90 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
19ea0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
19eb0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
19ec0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
19ed0 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
19ee0 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
19ef0 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
19f00 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
19f10 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
19f20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
19f30 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
19f40 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
19f50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
19f60 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19f70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19f80 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
19f90 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
19fa0 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
19fb0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
19fc0 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20  siveMode );.    
19fd0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
19fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
19ff0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1a000 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1a010 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1a020 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
1a030 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1a040 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1a050 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
1a060 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
1a070 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
1a080 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
1a090 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
1a0a0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
1a0b0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1a0c0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
1a0d0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
1a0e0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
1a0f0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
1a100 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
1a110 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
1a120 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
1a130 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
1a140 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
1a150 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1a160 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
1a170 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
1a180 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
1a190 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20  bPage *pPg){..  
1a1a0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1a1b0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
1a1c0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
1a1d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1a1e0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
1a1f0 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
1a200 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43  FINFO(pPg);..  C
1a210 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1a220 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
1a230 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
1a240 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
1a250 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
1a260 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
1a270 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
1a280 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1a290 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1a2a0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
1a2b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
1a2c0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
1a2d0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
1a2e0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
1a2f0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
1a300 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
1a310 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
1a320 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
1a330 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
1a340 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
1a350 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
1a360 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
1a370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a380 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
1a390 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1a3a0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1a3b0 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
1a3c0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
1a3d0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1a3e0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
1a3f0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1a400 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
1a410 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
1a420 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1a430 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
1a440 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1a450 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
1a460 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
1a470 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
1a480 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
1a490 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
1a4a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a4b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
1a4c0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
1a4d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a4e0 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
1a4f0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
1a500 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
1a510 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
1a520 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1a530 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
1a540 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
1a550 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1a560 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1a570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a580 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1a590 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
1a5a0 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
1a5b0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1a5c0 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
1a5d0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
1a5e0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1a5f0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
1a600 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1a610 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
1a620 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
1a630 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
1a640 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
1a650 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
1a660 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
1a670 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1a680 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
1a690 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
1a6a0 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
1a6b0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1a6c0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
1a6d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1a6e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1a6f0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1a700 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a710 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1a720 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1a730 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1a740 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1a750 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1a760 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  l==0 );.  sqlite
1a770 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1a780 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
1a790 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1a7a0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1a7b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1a7c0 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
1a7d0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1a7e0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
1a7f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1a800 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1a810 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1a820 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
1a830 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70  sOpenExclusive(p
1a840 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1a850 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20   &pPager->jfd,. 
1a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a880 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1a890 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
1a8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
1a8b0 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70  ager->jfd );.  p
1a8c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a8d0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
1a8e0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1a8f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1a900 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
1a910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a920 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a930 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
1a940 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1a950 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
1a960 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nal);.    }.    
1a970 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
1a980 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
1a990 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46  .  sqlite3OsSetF
1a9a0 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  ullSync(pPager->
1a9b0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  jfd, pPager->ful
1a9c0 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
1a9d0 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63  te3OsSetFullSync
1a9e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
1a9f0 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
1aa00 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  ;.  sqlite3OsOpe
1aa10 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65  nDirectory(pPage
1aa20 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
1aa30 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70  zDirectory);.  p
1aa40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1aa50 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  en = 1;.  pPager
1aa60 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1aa70 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1aa80 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1aa90 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1aaa0 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50  llback = 0;.  pP
1aab0 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
1aac0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1aad0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20  rCode ){.    rc 
1aae0 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1aaf0 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  e;.    goto fail
1ab00 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
1ab10 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  al;.  }.  pPager
1ab20 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1ab30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
1ab40 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
1ab50 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
1ab60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ab70 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72  tmtAutoopen && r
1ab80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ab90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aba0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
1abb0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
1abc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1abd0 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
1abe0 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MEM ){.    rc = 
1abf0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
1ac00 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
1ac10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ac20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1ac30 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
1ac40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ac50 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74  rn rc;..failed_t
1ac60 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a  o_open_journal:.
1ac70 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
1ac80 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29  ger->aInJournal)
1ac90 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
1aca0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65  ournal = 0;.  re
1acb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1acc0 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
1acd0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
1ace0 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
1acf0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
1ad00 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
1ad10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
1ad20 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
1ad30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ad40 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73  mitPhaseTwo() is
1ad50 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1ad60 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1ad70 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
1ad80 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
1ad90 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69  e3PagerClose() i
1ada0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1adb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1adc0 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ref() is called 
1add0 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73  to on every outs
1ade0 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a  tanding page..**
1adf0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
1ae00 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20  rameter to this 
1ae10 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69  routine is a poi
1ae20 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e  nter to any open
1ae30 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
1ae40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ae50 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20  Nothing changes 
1ae60 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d  about the page -
1ae70 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65   it is used mere
1ae80 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65  ly to.** acquire
1ae90 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1aea0 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
1aeb0 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74  e and as proof t
1aec0 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  hat there is.** 
1aed0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1aee0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1aef0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ase..**.** The s
1af00 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1af10 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75  indicates how mu
1af20 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65  ch space in byte
1af30 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  s to reserve for
1af40 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75   a.** master jou
1af50 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61  rnal file-name a
1af60 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
1af70 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20  he journal when 
1af80 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a  it is created..*
1af90 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66  *.** A journal f
1afa0 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66  ile is opened if
1afb0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
1afc0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20  emporary file.  
1afd0 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a  For temporary.**
1afe0 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e   files, the open
1aff0 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ing of the journ
1b000 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
1b010 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
1b020 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20  is an.** actual 
1b030 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  need to write to
1b040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a   the journal..**
1b050 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
1b060 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72  ase is already r
1b070 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74  eserved for writ
1b080 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ing, this routin
1b090 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
1b0a0 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73  .** If exFlag is
1b0b0 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20   true, go ahead 
1b0c0 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55  and get an EXCLU
1b0d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1b0e0 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61   file.** immedia
1b0f0 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20  tely instead of 
1b100 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65  waiting until we
1b110 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68   try to flush th
1b120 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a  e cache.  The.**
1b130 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72   exFlag is ignor
1b140 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ed if a transact
1b150 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61  ion is already a
1b160 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctive..*/.int sq
1b170 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
1b180 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  DbPage *pPg, int
1b190 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65   exFlag){.  Page
1b1a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1b1b0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1b1c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b1d0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1b1e0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
1b1f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1b200 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1b210 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1b220 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1b230 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
1b240 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1b250 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
1b260 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1b270 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1b280 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
1b290 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
1b2a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1b2b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1b2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b2d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
1b2e0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  k(pPager->fd, RE
1b2f0 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
1b300 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1b320 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1b330 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b   PAGER_RESERVED;
1b340 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46  .        if( exF
1b350 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lag ){.         
1b360 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1b370 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1b380 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1b390 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b3a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1b3b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b3c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b3d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b3e0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1b3f0 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41  he = 0;.      PA
1b400 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53  GERTRACE2("TRANS
1b410 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
1b420 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1b430 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1b440 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
1b450 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1b460 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
1b470 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1b480 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1b490 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1b4a0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
1b4b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1b4c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b4d0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
1b4e0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1b4f0 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69   the pager was i
1b500 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1b510 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20  ss mode last.   
1b520 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64   ** time a (read
1b530 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73   or write) trans
1b540 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65  action was succe
1b550 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65  ssfully conclude
1b560 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73  d.    ** by this
1b570 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73   connection. Ins
1b580 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67  tead of deleting
1b590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1b5a0 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a  e it was .    **
1b5b0 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74   kept open and t
1b5c0 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79  runcated to 0 by
1b5d0 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tes..    */.    
1b5e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b5f0 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nRec==0 );.    a
1b600 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
1b610 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a  rigDbSize==0 );.
1b620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1b630 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1b640 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1b650 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1b660 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b670 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1b680 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1b690 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1b6a0 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  + 1 );.    if( !
1b6b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1b6c0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1b6d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1b6e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b6f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1b700 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1b710 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
1b720 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1b730 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1b740 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
1b750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b760 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
1b770 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
1b780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1b790 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b7a0 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20  .** Make a page 
1b7b0 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20  dirty.  Set its 
1b7c0 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61  dirty flag and a
1b7d0 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72  dd it to the dir
1b7e0 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e  ty.** page list.
1b7f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b800 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20  makeDirty(PgHdr 
1b810 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1b820 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20  ->dirty==0 ){.  
1b830 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1b840 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1b850 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b860 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72  1;.    pPg->pDir
1b870 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69  ty = pPager->pDi
1b880 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61  rty;.    if( pPa
1b890 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  ger->pDirty ){. 
1b8a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69       pPager->pDi
1b8b0 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1b8c0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1b8d0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1b8e0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1b8f0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a  ->pDirty = pPg;.
1b900 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1b910 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20  e a page clean. 
1b920 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79   Clear its dirty
1b930 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20   bit and remove 
1b940 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64  it from the.** d
1b950 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a  irty page list..
1b960 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1b970 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a  akeClean(PgHdr *
1b980 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b990 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50  >dirty ){.    pP
1b9a0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
1b9b0 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74    if( pPg->pDirt
1b9c0 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
1b9d0 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72  pDirty->pPrevDir
1b9e0 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44  ty = pPg->pPrevD
1b9f0 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irty;.    }.    
1ba00 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69  if( pPg->pPrevDi
1ba10 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67  rty ){.      pPg
1ba20 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44  ->pPrevDirty->pD
1ba30 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
1ba40 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
1ba50 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
1ba60 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1ba70 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
1ba80 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  }.}.../*.** Mark
1ba90 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20   a data page as 
1baa0 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20  writeable.  The 
1bab0 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
1bac0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
1bad0 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f   .** if it is no
1bae0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1baf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
1bb00 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65  ust be called be
1bb10 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63  fore making.** c
1bb20 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65  hanges to a page
1bb30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
1bb40 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1bb50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
1bb60 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73  he pager creates
1bb70 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61   a new.** journa
1bb80 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  l and acquires a
1bb90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1bba0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
1bbb0 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44   If the RESERVED
1bbc0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  .** lock could n
1bbd0 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20  ot be acquired, 
1bbe0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1bbf0 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59  urns SQLITE_BUSY
1bc00 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e  .  The.** callin
1bc10 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63  g routine must c
1bc20 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65  heck for that re
1bc30 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62  turn value and b
1bc40 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f  e careful not to
1bc50 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70  .** change any p
1bc60 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74  age data until t
1bc70 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bc80 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  rns SQLITE_OK..*
1bc90 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
1bca0 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e  nal file could n
1bcb0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  ot be written be
1bcc0 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69  cause the disk i
1bcd0 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20  s full,.** then 
1bce0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1bcf0 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c  urns SQLITE_FULL
1bd00 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d   and does an imm
1bd10 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e  ediate rollback.
1bd20 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65  .** All subseque
1bd30 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74  nt write attempt
1bd40 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51  s also return SQ
1bd50 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20  LITE_FULL until 
1bd60 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61  there.** is a ca
1bd70 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ll to sqlite3Pag
1bd80 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71  erCommit() or sq
1bd90 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1bda0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
1bdb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bdc0 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
1bdd0 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
1bde0 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54  *pData = PGHDR_T
1bdf0 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50  O_DATA(pPg);.  P
1be00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1be10 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
1be20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1be30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  ;..  /* Check fo
1be40 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20  r errors.  */.  
1be50 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1be60 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ode ){ .    retu
1be70 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1be80 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1be90 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
1bea0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1beb0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
1bec0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1bed0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
1bee0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
1bef0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1bf00 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f   page was previo
1bf10 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69  usly acquired wi
1bf20 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c  th noContent==1,
1bf30 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   that means.  **
1bf40 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c   we didn't reall
1bf50 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f  y read in the co
1bf60 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1bf70 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70  e.  This can hap
1bf80 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78  pen.  ** (for ex
1bf90 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20  ample) when the 
1bfa0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f  page is being mo
1bfb0 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ved to the freel
1bfc0 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e  ist.  But.  ** n
1bfd0 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61  ow we are (perha
1bfe0 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70  ps) moving the p
1bff0 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66  age off of the f
1c000 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a  reelist for.  **
1c010 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65   reuse and we ne
1c020 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f  ed to know its o
1c030 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
1c040 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a  so that content.
1c050 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72    ** can be stor
1c060 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
1c070 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20  ck journal.  So 
1c080 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74  do the read at t
1c090 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20  his.  ** time.. 
1c0a0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
1c0b0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1c0c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1c0d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c0e0 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65  }..  /* Mark the
1c0f0 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20   page as dirty. 
1c100 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73   If the page has
1c110 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1c120 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68  itten.  ** to th
1c130 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77  e journal then w
1c140 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67  e can return rig
1c150 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20  ht away..  */.  
1c160 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a  makeDirty(pPg);.
1c170 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75    if( pPg->inJou
1c180 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53  rnal && (pageInS
1c190 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c  tatement(pPg) ||
1c1a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1c1b0 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
1c1c0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1c1d0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
1c1e0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
1c1f0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
1c200 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1c210 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
1c220 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
1c230 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1c240 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
1c250 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
1c260 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
1c270 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c280 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
1c290 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
1c2a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1c2b0 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
1c2c0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
1c2d0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
1c2e0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1c2f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1c300 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1c310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c320 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29  gerBegin(pPg, 0)
1c330 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c340 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c350 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c360 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1c370 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1c380 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1c390 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1c3a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70  journalOpen && p
1c3b0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
1c3c0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1c3d0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1c3e0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1c3f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c400 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1c410 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1c420 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1c430 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65  alOpen || !pPage
1c440 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1c450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
1c460 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a  tyCache = 1;.  .
1c470 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73      /* The trans
1c480 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e  action journal n
1c490 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65  ow exists and we
1c4a0 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44   have a RESERVED
1c4b0 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   or an.    ** EX
1c4c0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1c4d0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1c4e0 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74  e file.  Write t
1c4f0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1c500 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72  to.    ** the tr
1c510 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1c520 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  l if it is not t
1c530 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20  here already..  
1c540 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1c550 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
1c560 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  (pPager->useJour
1c570 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b  nal || MEMDB) ){
1c580 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29  .      if( (int)
1c590 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1c5a0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1c5b0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
1c5c0 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28  zPg;.        if(
1c5d0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1c5e0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
1c5f0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
1c600 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
1c610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
1c620 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
1c630 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c640 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c650 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c660 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c670 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
1c680 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
1c690 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
1c6a0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1c6b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1c6c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c6d0 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
1c6e0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
1c6f0 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
1c700 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1c710 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1c720 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1c730 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1c740 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
1c750 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20  cksum, saved;.  
1c760 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1c770 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20  ata2, *pEnd;.   
1c780 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
1c790 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
1c7a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1c7b0 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
1c7c0 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
1c7d0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
1c7e0 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
1c7f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1c800 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
1c810 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
1c820 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
1c830 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1c840 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
1c850 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
1c860 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61  .          pData
1c870 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  2 = CODEC2(pPage
1c880 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
1c890 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20  gno, 7);.       
1c8a0 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72     cksum = pager
1c8b0 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28  _cksum(pPager, (
1c8c0 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20  u8*)pData2);.   
1c8d0 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44         pEnd = pD
1c8e0 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70  ata2 + pPager->p
1c8f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
1c900 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a     pData2 -= 4;.
1c910 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20            saved 
1c920 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20  = *(u32*)pEnd;. 
1c930 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69           put32bi
1c940 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b  ts(pEnd, cksum);
1c950 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20  .          szPg 
1c960 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
1c970 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+8;.          
1c980 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1c990 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c9a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c9b0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1c9c0 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c  er->jfd, pData2,
1c9d0 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
1c9e0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
1c9f0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
1ca00 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1ca10 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  pgno,.          
1ca20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1ca30 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50  >journalOff, szP
1ca40 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  g));.          P
1ca50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1ca60 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
1ca70 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ount);.         
1ca80 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ca90 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20  Off += szPg;.   
1caa0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1cab0 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
1cac0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
1cad0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1cae0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1caf0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1cb00 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1cb10 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  nc);.          *
1cb20 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76  (u32*)pEnd = sav
1cb30 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72  ed;...  /* An er
1cb40 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
1cb50 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
1cb60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1cb70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
1cb80 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1cb90 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1cba0 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1cbb0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1cbc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1cbd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1cbf0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1cc00 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
1cc10 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
1cc20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1cc30 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1cc40 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
1cc50 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1cc60 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1cc70 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1cc80 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
1cc90 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1cca0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1ccb0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ccc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1ccd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1cce0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1ccf0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1cd00 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1cd10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1cd20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1cd30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
1cd40 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1cd50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1cd60 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
1cd70 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1cd80 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
1cd90 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1cda0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1cdb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cdc0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1cdd0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1cde0 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1cdf0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1ce00 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1ce10 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1ce20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1ce30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1ce40 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1ce50 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1ce60 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1ce70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
1ce80 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1ce90 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
1cea0 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
1ceb0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1cec0 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
1ced0 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
1cee0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
1cef0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1cf00 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
1cf10 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
1cf20 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
1cf30 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
1cf40 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
1cf50 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
1cf60 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
1cf70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1cf80 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
1cf90 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
1cfa0 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
1cfb0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1cfc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1cfd0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
1cfe0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1cff0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1d000 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1d010 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1d020 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1d030 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1d040 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1d050 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1d060 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1d070 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1d080 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
1d090 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1d0a0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1d0b0 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
1d0c0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
1d0d0 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
1d0e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1d0f0 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
1d100 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1d110 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1d120 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1d130 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
1d140 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1d150 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1d160 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1d170 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1d180 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64  .        page_ad
1d190 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1d1a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
1d1b0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1d1c0 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1d1d0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1d1e0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
1d1f0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1d200 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1d210 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
1d220 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1d230 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1d240 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1d250 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
1d260 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1d270 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1d280 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1d290 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1d2a0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1d2b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d2c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d2d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1d2f0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
1d300 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1d310 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1d320 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
1d330 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1d340 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1d350 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1d360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d370 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
1d380 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1d390 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
1d3a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1d3b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1d3c0 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1d3d0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1d3e0 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
1d3f0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1d400 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
1d410 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  gno;.    if( !ME
1d420 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1d430 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
1d440 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
1d450 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
1d460 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
1d470 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1d480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d490 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d4a0 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20   used to mark a 
1d4b0 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69  data-page as wri
1d4c0 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a  table. It uses .
1d4d0 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  ** pager_write()
1d4e0 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e   to open a journ
1d4f0 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69  al file (if it i
1d500 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1d510 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  en).** and write
1d520 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61   the page *pData
1d530 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1d540 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
1d550 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1d560 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
1d570 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
1d580 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
1d590 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
1d5a0 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
1d5b0 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
1d5c0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
1d5d0 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
1d5e0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
1d5f0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
1d600 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
1d610 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
1d620 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1d630 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
1d640 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1d650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1d660 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
1d670 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
1d680 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1d690 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
1d6a0 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
1d6b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1d6c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
1d6d0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
1d6e0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
1d6f0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
1d700 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
1d710 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50  !MEMDB && nPageP
1d720 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
1d730 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
1d740 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
1d750 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1d760 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1d770 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
1d780 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
1d790 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1d7a0 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1d7b0 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1d7c0 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
1d7d0 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1d7e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d7f0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
1d800 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
1d810 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
1d820 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  ii;..    /* Set 
1d830 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1d840 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1d850 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1d860 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1d870 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1d880 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1d890 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1d8a0 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1d8b0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1d8c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d8d0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1d8e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
1d8f0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1d900 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
1d910 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
1d920 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
1d930 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
1d940 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
1d950 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
1d960 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
1d970 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
1d980 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
1d990 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
1d9a0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1d9b0 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1d9c0 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
1d9d0 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
1d9e0 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
1d9f0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
1da00 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
1da10 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61  ount = sqlite3Pa
1da20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1da30 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1da40 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
1da50 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1da60 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
1da70 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
1da80 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
1da90 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
1daa0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1dab0 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
1dac0 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
1dad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
1dae0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
1daf0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
1db00 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
1db10 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
1db20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1db30 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
1db40 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
1db50 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1db60 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
1db70 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
1db80 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
1db90 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66  pg1+ii;.      if
1dba0 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1dbb0 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67  urnal || pg==pPg
1dbc0 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20  ->pgno || .     
1dbd0 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e       pg>pPager->
1dbe0 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28  origDbSize || !(
1dbf0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1dc00 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67  al[pg/8]&(1<<(pg
1dc10 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a  &7))).      ) {.
1dc20 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
1dc30 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1dc40 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1dc50 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
1dc60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1dc70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1dc80 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
1dc90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1dca0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dcb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dcc0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1dcd0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1dce0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1dcf0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1dd00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1dd20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1dd30 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1dd40 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
1dd50 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1dd60 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1dd70 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1dd80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
1dd90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1dda0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1ddb0 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
1ddc0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1ddd0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
1dde0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
1ddf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1de00 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
1de10 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
1de20 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
1de30 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
1de40 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1de50 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
1de60 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1de70 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1de80 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1de90 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
1dea0 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ty;.}.#endif..#i
1deb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1dec0 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
1ded0 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
1dee0 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
1def0 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
1df00 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
1df10 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
1df20 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1df30 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28  3PagerOverwrite(
1df40 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1df50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
1df60 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1df70 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
1df80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1df90 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1dfa0 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69  pgno, &pPg);.  i
1dfb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1dfd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1dfe0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
1dff0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e000 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74      memcpy(sqlit
1e010 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1e020 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67  Pg), pData, pPag
1e030 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1e040 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e050 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1e060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e070 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1e080 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1e090 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1e0a0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1e0b0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1e0c0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1e0d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1e0e0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
1e0f0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
1e100 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
1e110 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
1e120 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
1e130 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
1e140 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
1e150 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
1e160 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
1e170 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
1e180 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
1e190 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
1e1a0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
1e1b0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
1e1c0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
1e1d0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
1e1e0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
1e1f0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
1e200 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
1e210 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
1e220 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
1e230 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1e240 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
1e250 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
1e260 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
1e270 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
1e280 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
1e290 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
1e2a0 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
1e2b0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
1e2c0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
1e2d0 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
1e2e0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
1e2f0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
1e300 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1e310 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1e320 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
1e330 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
1e340 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
1e350 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
1e360 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
1e370 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
1e380 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
1e390 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
1e3a0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
1e3b0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
1e3c0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
1e3d0 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
1e3e0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
1e3f0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
1e400 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
1e410 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1e420 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
1e430 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1e440 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1e450 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1e460 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1e470 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e480 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1e490 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
1e4a0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1e4b0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
1e4c0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
1e4d0 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
1e4e0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
1e4f0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
1e500 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
1e510 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
1e520 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1e530 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
1e540 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e550 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1e560 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1e570 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1e580 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1e590 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1e5a0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1e5b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1e5c0 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
1e5d0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  B ) return;.  pP
1e5e0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1e5f0 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
1e600 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
1e610 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1e620 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e630 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1e640 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1e650 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1e660 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
1e670 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
1e680 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
1e690 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
1e6a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1e6b0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
1e6c0 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
1e6d0 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
1e6e0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
1e6f0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
1e700 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1e710 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
1e720 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1e730 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
1e740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e750 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
1e760 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
1e770 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
1e780 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
1e790 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
1e7a0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
1e7b0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
1e7c0 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1e7d0 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
1e7e0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
1e7f0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
1e800 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1e810 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
1e820 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
1e830 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
1e840 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
1e850 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
1e860 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
1e870 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
1e880 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1e890 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
1e8a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1e8b0 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1e8c0 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1e8d0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1e8e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1e8f0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
1e900 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
1e910 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1e920 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
1e930 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
1e940 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1e950 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1e960 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1e970 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1e980 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1e990 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1e9a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1e9b0 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1e9c0 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1e9d0 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1e9e0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1e9f0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1ea00 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1ea10 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1ea20 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1ea30 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1ea40 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1ea50 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1ea60 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1ea70 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1ea80 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  we have not yet 
1ea90 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68  actually read th
1eaa0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
1eab0 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68  s page (if.** th
1eac0 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
1ead0 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68   flag is set) th
1eae0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1eaf0 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73  acts as a promis
1eb00 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c  e.** that we wil
1eb10 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  l never need to 
1eb20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f  read the page co
1eb30 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74  ntent in the fut
1eb40 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e  ure..** so the n
1eb50 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e  eedRead flag can
1eb60 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74   be cleared at t
1eb70 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f  his point..*/.vo
1eb80 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1eb90 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
1eba0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
1ebb0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1ebc0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65  >pPager;..  asse
1ebd0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ebe0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1ebf0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1ec00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1ec10 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1ec20 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
1ec30 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
1ec40 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1ec50 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  || MEMDB ) retur
1ec60 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
1ec70 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
1ec80 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
1ec90 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1eca0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ecb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ecc0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
1ecd0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1ece0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1ecf0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1ed00 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
1ed10 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50  rnal = 1;.    pP
1ed20 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1ed30 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ed40 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1ed50 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1ed60 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1ed70 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1ed80 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o&7);.    }.    
1ed90 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1eda0 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
1edb0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
1edc0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1edd0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f  pPager));.    IO
1ede0 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
1edf0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
1ee00 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
1ee10 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1ee20 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26  stmtInUse .   &&
1ee30 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
1ee40 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69  t(pPg) .   && (i
1ee50 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1ee60 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
1ee70 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
1ee80 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ee90 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1eea0 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1eeb0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
1eec0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1eed0 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
1eee0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1eef0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1ef00 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1ef10 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
1ef20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1ef30 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1ef40 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1ef50 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1ef60 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1ef70 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1ef80 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1ef90 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1efa0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1efb0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1efc0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
1efd0 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
1efe0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
1eff0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
1f000 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1f010 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  one ){.    /* Op
1f020 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
1f030 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
1f040 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
1f050 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1f060 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
1f070 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
1f080 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1f090 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1f0a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f0b0 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69  e(pPgHdr);.    i
1f0c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f0d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f0e0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1f0f0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
1f100 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
1f110 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1f120 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74   = retrieve32bit
1f130 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20  s(pPgHdr, 24);. 
1f140 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65   .    /* Increme
1f150 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73  nt the value jus
1f160 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65  t read and write
1f170 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65   it back to byte
1f180 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
1f190 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1f1a0 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
1f1b0 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
1f1c0 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63  A(pPgHdr))+24, c
1f1d0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
1f1e0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
1f1f0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1f200 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
1f210 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f220 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
1f230 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1f240 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
1f250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1f270 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f280 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1f290 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1f2a0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1f2b0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1f2c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1f2d0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1f2e0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1f2f0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1f300 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1f310 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1f320 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1f330 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1f340 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1f350 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1f360 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1f370 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f380 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1f390 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1f3a0 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1f3b0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1f3c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1f3d0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1f3e0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1f3f0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1f400 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1f410 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1f420 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1f430 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1f440 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1f450 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1f460 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1f470 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1f480 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1f490 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1f4a0 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1f4b0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1f4c0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1f4d0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1f4e0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
1f4f0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1f500 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1f510 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1f520 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1f530 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1f540 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1f550 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1f560 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1f570 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1f580 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1f590 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50  aseOne(Pager *pP
1f5a0 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
1f5b0 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
1f5c0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
1f5d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1f5e0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
1f5f0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1f600 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1f610 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1f620 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1f630 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1f640 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1f650 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1f660 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1f670 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1f680 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1f690 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1f6a0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1f6b0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1f6c0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1f6d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1f6e0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1f6f0 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1f700 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1f710 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1f720 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1f730 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1f740 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1f750 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1f760 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1f770 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f780 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1f790 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1f7a0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1f7b0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1f7c0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1f7d0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1f7e0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1f7f0 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1f800 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1f810 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1f820 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1f830 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1f840 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1f850 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1f860 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1f870 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1f880 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1f890 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1f8a0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1f8b0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1f8c0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1f8d0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1f8e0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1f8f0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1f900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1f910 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1f920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f930 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f940 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1f950 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1f960 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1f970 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1f980 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1f990 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1f9a0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1f9b0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1f9c0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1f9d0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1f9e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1f9f0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1fa00 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1fa10 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1fa20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
1fa30 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1fa40 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
1fa50 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
1fa60 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1fa70 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
1fa80 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
1fa90 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1faa0 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
1fab0 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
1fac0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1fad0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1fae0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1faf0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1fb00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fb10 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1fb20 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
1fb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb40 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
1fb50 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fb60 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1fb70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1fb80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fb90 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fba0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1fbb0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1fbc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1fbd0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1fbe0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1fbf0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
1fc00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc10 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fc20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
1fc30 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1fc40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1fc50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1fc60 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1fc70 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1fc80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fc90 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1fca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1fcb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1fcc0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1fcd0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1fce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fcf0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1fd00 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1fd10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1fd20 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1fd30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fd40 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
1fd50 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1fd60 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1fd70 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1fd80 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1fd90 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1fda0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1fdb0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1fdc0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1fdd0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
1fde0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1fdf0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1fe00 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1fe10 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fe20 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1fe30 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1fe40 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
1fe50 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
1fe60 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
1fe70 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1fe80 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
1fe90 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
1fea0 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1feb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fec0 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1fed0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
1fee0 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1fef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1ff00 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1ff10 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ff20 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1ff30 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ff40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ff50 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1ff60 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1ff70 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1ff80 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1ff90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ffa0 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1ffb0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1ffc0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1ffd0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1ffe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1fff0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
20000 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
20010 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
20020 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
20030 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
20040 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
20050 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
20060 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
20070 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
20080 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
20090 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
200a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
200b0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
200c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
200d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
200e0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
200f0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
20100 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
20110 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
20120 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
20130 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
20140 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
20150 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  );.      clearHi
20160 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
20170 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
20180 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
20190 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
201a0 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
201b0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
201c0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
201d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
201e0 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
201f0 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
20200 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
20210 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20  pDirty;.    }.  
20220 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
20230 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44   = 0;.#ifndef ND
20240 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
20250 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
20260 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
20270 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
20280 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
20290 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
202a0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
202b0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
202c0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
202d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
202e0 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
202f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20300 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
20310 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
20320 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
20330 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
20340 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
20350 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
20360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
20370 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
20380 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
20390 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  | !pPager->dirty
203a0 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72  Cache );.  asser
203b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
203c0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
203d0 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  | !pPager->dirty
203e0 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20  Cache );.  rc = 
203f0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
20400 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
20410 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
20420 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
20430 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
20440 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20  ck all changes. 
20450 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61   The database fa
20460 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  lls back to PAGE
20470 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a  R_SHARED mode..*
20480 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20  * All in-memory 
20490 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65  cache pages reve
204a0 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67  rt to their orig
204b0 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e  inal data conten
204c0 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ts..** The journ
204d0 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  al is deleted..*
204e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
204f0 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e  e cannot fail un
20500 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20  less some other 
20510 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66  process is not f
20520 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20  ollowing.** the 
20530 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20  correct locking 
20540 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65  protocol or unle
20550 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
20560 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
20570 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
20580 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20590 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
205a0 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
205b0 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
205c0 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
205d0 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
205e0 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
205f0 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
20600 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
20610 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
20620 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
20630 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
20640 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20650 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
20660 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
20670 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  rc;.  PAGERTRACE
20680 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  2("ROLLBACK %d\n
20690 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
206a0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
206b0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
206c0 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67  ;.    for(p=pPag
206d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
206e0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
206f0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
20700 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ist;.      asser
20710 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c  t( !p->alwaysRol
20720 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  lback );.      i
20730 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a  f( !p->dirty ){.
20740 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20750 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
20760 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
20770 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20  pPager))->pOrig 
20780 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
20790 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
207a0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
207b0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74  p, pPager))->pSt
207c0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  mt );.        co
207d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
207e0 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50  .      pHist = P
207f0 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
20800 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
20810 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  f( pHist->pOrig 
20820 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
20830 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
20840 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  p), pHist->pOrig
20850 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
20860 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ze);.        PAG
20870 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41  ERTRACE3("ROLLBA
20880 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
20890 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
208a0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
208b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
208c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
208d0 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65  ("PAGE %d is cle
208e0 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e  an on %d\n", p->
208f0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
20900 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a  ager));.      }.
20910 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
20920 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20  ry(pHist);.     
20930 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20   p->dirty = 0;. 
20940 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61       p->inJourna
20950 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  l = 0;.      pHi
20960 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
20970 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72        pHist->pPr
20980 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e  evStmt = pHist->
20990 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
209a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
209b0 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
209c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
209d0 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65  einiter(p, pPage
209e0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
209f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20a00 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
20a10 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
20a20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
20a30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20a40 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
20a50 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72  ze;.    pager_tr
20a60 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61  uncate_cache(pPa
20a70 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
20a80 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
20a90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20aa0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
20ab0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
20ac0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
20ad0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
20ae0 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
20af0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20b00 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
20b10 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20b20 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  n(pPager);.    r
20b30 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
20b40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
20b50 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
20b60 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
20b70 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20  FULL ){.    if( 
20b80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
20b90 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
20ba0 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c  {.      pager_pl
20bb0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
20bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
20bd0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
20be0 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
20bf0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
20c00 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
20c10 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
20c20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
20c30 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
20c40 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
20c50 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20c60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
20c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20c80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
20c90 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
20ca0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
20cb0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
20cc0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  , 0);.  }.  /* p
20cd0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
20ce0 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  r); */.  pPager-
20cf0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
20d00 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
20d10 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
20d20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
20d30 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
20d40 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
20d50 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
20d60 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
20d70 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
20d80 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
20d90 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
20da0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61    */.  return pa
20db0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
20dc0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
20dd0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
20de0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20df0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
20e00 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
20e10 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
20e20 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
20e30 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
20e40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20e50 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61  gerIsreadonly(Pa
20e60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20e70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72  return pPager->r
20e80 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  eadOnly;.}../*.*
20e90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
20ea0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
20eb0 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a  s to the pager..
20ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20ed0 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65  gerRefcount(Page
20ee0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20ef0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65  turn pPager->nRe
20f00 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  f;.}..#ifdef SQL
20f10 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54  ITE_TEST./*.** T
20f20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
20f30 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
20f40 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
20f50 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
20f60 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67  e3PagerStats(Pag
20f70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
20f80 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
20f90 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
20fa0 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
20fb0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
20fc0 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
20fd0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
20fe0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
20ff0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
21000 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
21010 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
21020 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61  de;.  a[6] = pPa
21030 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37  ger->nHit;.  a[7
21040 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73  ] = pPager->nMis
21050 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20  s;.  a[8] = 0;  
21060 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50  /* Used to be pP
21070 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20  ager->nOvfl */. 
21080 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
21090 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
210a0 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
210b0 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
210c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
210d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
210e0 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
210f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21100 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
21110 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
21120 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
21130 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
21140 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
21150 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
21160 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
21170 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
21180 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
21190 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
211a0 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
211b0 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
211c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
211d0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
211e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
211f0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
21200 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
21210 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
21220 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
21230 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
21240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
21250 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
21260 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
21270 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
21280 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21290 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
212a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
212b0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
212c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
212d0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
212e0 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
212f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
21300 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
21310 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
21320 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
21330 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
21340 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21350 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
21360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
21370 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
21380 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
21390 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
213a0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
213b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
213c0 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
213d0 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
213e0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
213f0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
21400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21410 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
21420 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
21430 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
21440 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
21450 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
21460 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
21470 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
21480 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
21490 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
214a0 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
214b0 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
214c0 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
214d0 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
214e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
214f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
21500 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
21510 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
21520 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
21530 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
21540 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
21550 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
21560 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
21570 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21580 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26  3PagerOpentemp(&
21590 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
215a0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
215b0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
215c0 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
215d0 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
215e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
215f0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
21600 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
21610 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
21620 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
21630 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
21640 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
21650 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
21660 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
21670 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67  nStmt);.    pPag
21680 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
21690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
216a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
216b0 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
216c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
216d0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
216e0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
216f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
21700 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
21710 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
21720 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
21730 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
21740 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
21750 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
21760 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
21770 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
21780 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
21790 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
217a0 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
217b0 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
217c0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
217d0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
217e0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
217f0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
21800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
21810 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
21820 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
21830 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Next){.        P
21840 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
21850 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
21860 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
21870 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48        pNext = pH
21880 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  ist->pNextStmt;.
21890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
218a0 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b  pHist->inStmt );
218b0 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
218c0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
218d0 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76      pHist->pPrev
218e0 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e  Stmt = pHist->pN
218f0 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
21900 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
21910 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
21920 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
21930 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
21940 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
21950 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
21960 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
21970 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
21980 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
21990 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
219a0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
219b0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
219c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
219d0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
219e0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
219f0 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
21a00 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
21a10 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
21a20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21a30 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
21a40 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54  AGERTRACE2("STMT
21a50 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
21a60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21a70 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
21a80 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
21a90 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69  *pPg;.      PgHi
21aa0 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
21ab0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
21ac0 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
21ad0 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74  pPg=pHist->pNext
21ae0 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70  Stmt){.        p
21af0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
21b00 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
21b10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21b20 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
21b30 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21b40 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
21b50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  g), pHist->pStmt
21b60 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21b70 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
21b80 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
21b90 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
21ba0 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
21bb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
21bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
21bd0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
21be0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
21bf0 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e        pager_trun
21c00 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65  cate_cache(pPage
21c10 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  r);.      rc = S
21c20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
21c30 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
21c40 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
21c50 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
21c60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
21c70 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
21c80 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
21c90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21ca0 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  OK;.  }.  pPager
21cb0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
21cc0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
21cd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21ce0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
21cf0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
21d00 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
21d10 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
21d20 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67  agerFilename(Pag
21d30 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
21d40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46  eturn pPager->zF
21d50 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
21d60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72  * Return the dir
21d70 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61  ectory of the da
21d80 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
21d90 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
21da0 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
21db0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
21dc0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21dd0 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
21de0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21df0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
21e00 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
21e10 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
21e20 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a  r *sqlite3PagerJ
21e30 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
21e40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21e50 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
21e60 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rnal;.}../*.** R
21e70 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73  eturn true if fs
21e80 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20  ync() calls are 
21e90 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69  disabled for thi
21ea0 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e  s pager.  Return
21eb0 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79   FALSE.** if fsy
21ec0 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74  nc()s are execut
21ed0 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a  ed normally..*/.
21ee0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
21ef0 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50  Nosync(Pager *pP
21f00 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
21f10 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
21f20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
21f30 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a  _HAS_CODEC./*.**
21f40 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66   Set the codec f
21f50 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f  or this pager.*/
21f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
21f70 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61  erSetCodec(.  Pa
21f80 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
21f90 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
21fa0 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
21fb0 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
21fc0 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
21fd0 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
21fe0 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
21ff0 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
22000 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ecArg;.}.#endif.
22010 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22020 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
22030 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
22040 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
22050 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74  y pData to locat
22060 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
22070 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  file. .**.** The
22080 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
22090 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
220a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e  current page pgn
220b0 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61  o. If current pa
220c0 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f  ge.** pgno is no
220d0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
220e0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
220f0 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69  l, it is not wri
22100 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a  tten there by.**
22110 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
22120 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69  . The same appli
22130 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
22140 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f  Data refers to o
22150 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  n entry to.** th
22160 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
22170 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
22180 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64  the page refered
22190 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d   to by pData rem
221a0 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
221b0 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
221c0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
221d0 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20  with page pData 
221e0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
221f0 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
22200 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
22210 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
22220 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
22230 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
22240 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
22250 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
22260 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
22270 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
22280 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20  e is called. It 
22290 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65  used to be.** re
222a0 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74  quired that a st
222b0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
222c0 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69  ion was not acti
222d0 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73  ve, but this res
222e0 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20  triction.** has 
222f0 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52  been removed (CR
22300 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73  EATE INDEX needs
22310 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20   to move a page 
22320 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  when a statement
22330 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
22340 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69  is active)..*/.i
22350 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  nt sqlite3PagerM
22360 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
22370 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70  Pager, DbPage *p
22380 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
22390 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
223a0 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
223b0 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
223c0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
223d0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
223e0 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f   PAGERTRACE5("MO
223f0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
22400 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
22410 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
22420 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
22430 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
22440 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
22450 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  no);.  IOTRACE((
22460 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e  "MOVE %p %d %d\n
22470 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
22480 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20  pgno, pgno))..  
22490 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
224a0 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50  t(pPg);.  if( pP
224b0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
224c0 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20     needSyncPgno 
224d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
224e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
224f0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61  Journal );.    a
22500 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
22510 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
22520 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
22530 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  c );.  }..  /* U
22540 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
22550 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a  t's hash-chain *
22560 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68  /.  unlinkHashCh
22570 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29  ain(pPager, pPg)
22580 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
22590 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  ache contains a 
225a0 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e  page with page-n
225b0 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f  umber pgno, remo
225c0 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20  ve it.  ** from 
225d0 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e  it's hash chain.
225e0 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67   Also, if the Pg
225f0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73  Hdr.needSync was
22600 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70   set for .  ** p
22610 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20  age pgno before 
22620 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61  the 'move' opera
22630 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74  tion, it needs t
22640 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20  o be retained . 
22650 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65   ** for the page
22660 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20   moved there..  
22670 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  */.  pPgOld = pa
22680 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
22690 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
226a0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
226b0 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
226c0 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
226d0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
226e0 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
226f0 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
22700 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  ld);.    if( pPg
22710 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  Old->needSync ){
22720 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22730 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  PgOld->inJournal
22740 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
22750 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
22760 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
22770 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73  c = 1;.      ass
22780 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
22790 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20  dSync );.    }. 
227a0 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
227b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
227c0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
227d0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
227e0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
227f0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
22800 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
22810 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
22820 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
22830 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
22840 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
22850 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
22860 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
22870 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
22880 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
22890 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
228a0 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
228b0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
228c0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
228d0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
228e0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
228f0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
22900 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
22910 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
22920 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
22930 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
22940 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
22950 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
22960 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
22970 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
22980 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
22990 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
229a0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
229b0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
229c0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
229d0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
229e0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
229f0 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
22a00 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
22a10 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
22a20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f    ** Pager.aInJo
22a30 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
22a40 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
22a50 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
22a60 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
22a70 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
22a80 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
22a90 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
22aa0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
22ab0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
22ac0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
22ad0 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
22ae0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
22af0 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
22b00 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
22b10 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
22b20 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
22b30 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
22b40 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
22b50 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
22b60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22b70 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
22b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22b90 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
22ba0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
22bb0 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
22bc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
22bd0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
22be0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
22bf0 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
22c00 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
22c10 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
22c20 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
22c30 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
22c40 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
22c50 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
22c60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
22c70 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
22c80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22c90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
22ca0 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
22cb0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
22cc0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
22cd0 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
22ce0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
22cf0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
22d00 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
22d10 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22d20 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
22d30 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
22d40 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
22d50 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
22d60 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
22d70 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
22d80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
22d90 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
22da0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
22db0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22dc0 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
22dd0 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  r?PGHDR_TO_EXTRA
22de0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29  (pPg, pPager):0)
22df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
22e00 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
22e10 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
22e20 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
22e30 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
22e40 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
22e50 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
22e60 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22e70 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
22e80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
22e90 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
22ea0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
22eb0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
22ec0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
22ed0 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
22ee0 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
22ef0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
22f00 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
22f10 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
22f20 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
22f30 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
22f40 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
22f50 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
22f60 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
22f70 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
22f80 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
22f90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
22fa0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
22fb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
22fc0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
22fd0 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
22fe0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
22ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
23000 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
23010 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
23020 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
23030 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
23040 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
23050 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
23060 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
23070 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
23080 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
23090 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
230a0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
230b0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
230c0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
230d0 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
230e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
230f0 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
23100 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
23110 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
23120 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
23130 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66  siveMode;.}..#if
23140 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
23150 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
23160 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
23170 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23180 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
23190 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
231a0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
231b0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
231c0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
231d0 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
231e0 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
231f0 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
23200 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
23210 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
23220 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
23230 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
23240 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
23250 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
23260 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
23270 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
23280 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
23290 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
232a0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
232b0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
232c0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
232d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
232e0 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
232f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23300 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
23310 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
23320 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
23330 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
23340 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
23350 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
23360 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
23370 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
23380 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
23390 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
233a0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
233b0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
233c0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
233d0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
233e0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
233f0 20 2a 2f 0a                                       */.