/ Hex Artifact Content
Login

Artifact b89ea0f592e499ee6d6cda10b84688f8e47a05ba:


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 30  : pager.c,v 1.30
0350: 36 20 32 30 30 37 2f 30 33 2f 32 39 20 31 38 3a  6 2007/03/29 18:
0360: 31 39 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a  19:52 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 74 68   is to remove th
0d50: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0d70: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0d80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0d90: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0db0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0dc0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dd0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0de0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0df0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0e00: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e10: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e40: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e50: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e60: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e70: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e80: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e90: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0ea0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0eb0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ed0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ee0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ef0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0f00: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f10: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f20: 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20  te_page_write() 
0f30: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f40: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f50: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f60: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f70: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f80: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f90: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0fa0: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fb0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fc0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
0fd0: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
0fe0: 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62 65  E occurs when be
0ff0: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1000: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1010: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1020: 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  e.  After an sql
1030: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1040: 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65  k().** or sqlite
1050: 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 2c  _pager_commit(),
1060: 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73 20   the state goes 
1070: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
1080: 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ARED..*/.#define
1090: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
10a0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
10b0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
10c0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
10d0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
10e0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
10f0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1100: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1110: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1130: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1140: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1150: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1160: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1170: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
1180: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1190: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73  _LOCK macro is s
11a0: 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f  et to true at co
11b0: 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74  mpile-time,.** t
11c0: 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d  hen failed attem
11d0: 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73  pts to get a res
11e0: 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20  erved lock will 
11f0: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
1200: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  callback..** Thi
1210: 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61  s is off by defa
1220: 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79  ult.  To see why
1230: 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1240: 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
1250: 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73  o:.** .** Suppos
1260: 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61  e thread A alrea
1270: 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20  dy has a shared 
1280: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1290: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a   reserved lock..
12a0: 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65  ** Thread B alre
12b0: 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76  ady has a reserv
12c0: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
12d0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
12e0: 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68  ock.  If.** both
12f0: 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69   threads are usi
1300: 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61  ng their busy ca
1310: 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68  llbacks, it migh
1320: 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65  t be a long time
1330: 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  .** be for one o
1340: 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69  f the threads gi
1350: 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73  ve up and allows
1360: 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72   the other to pr
1370: 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66  oceed..** But if
1380: 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69   the thread tryi
1390: 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65  ng to get the re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65  served lock give
13b0: 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  s up quickly.** 
13c0: 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76  (if it never inv
13d0: 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61  okes its busy ca
13e0: 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65  llback) then the
13f0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c   contention will
1400: 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20   be.** resolved 
1410: 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e  quickly..*/.#ifn
1420: 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  def SQLITE_BUSY_
1430: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20  RESERVED_LOCK.# 
1440: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55  define SQLITE_BU
1450: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1460: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1470: 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e   This macro roun
1480: 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20  ds values up so 
1490: 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75  that if the valu
14a0: 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20  e is an address 
14b0: 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74  it.** is guarant
14c0: 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64  eed to be an add
14d0: 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69  ress that is ali
14e0: 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74  gned to an 8-byt
14f0: 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23  e boundary..*/.#
1500: 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49  define FORCE_ALI
1510: 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58  GNMENT(X)   (((X
1520: 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20  )+7)&~7)../*.** 
1530: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
1540: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
1550: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
1560: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
1570: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
1580: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
1590: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
15a0: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
15b0: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
15c0: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
15d0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
15e0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
15f0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69  eader..**.** Cli
1600: 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20  ent code should 
1610: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1620: 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61  rWrite() on a pa
1630: 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69  ge prior to maki
1640: 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69  ng.** any modifi
1650: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20  cations to that 
1660: 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74  page.  The first
1670: 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61 67   time sqlite3Pag
1680: 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73 20  erWrite().** is 
1690: 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67  called, the orig
16a0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16b0: 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
16c0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
16d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
16e0: 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20  PgHdr.inJournal 
16f0: 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79  and PgHdr.needSy
1700: 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74  nc are set.  Lat
1710: 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  er, once.** the 
1720: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73  journal page has
1730: 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68   made it onto th
1740: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20  e disk surface, 
1750: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a  PgHdr.needSync.*
1760: 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54  * is cleared.  T
1770: 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65  he modified page
1780: 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74   cannot be writt
1790: 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
17a0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
17b0: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
17c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
17d0: 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  es has been sync
17e0: 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74  ed to disk and t
17f0: 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64  he.** PgHdr.need
1800: 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c  Sync has been cl
1810: 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eared..**.** The
1820: 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61   PgHdr.dirty fla
1830: 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71  g is set when sq
1840: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1850: 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a  ) is called and.
1860: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67  ** is cleared ag
1870: 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67  ain when the pag
1880: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69  e content is wri
1890: 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
18a0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
18b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74  abase file..*/.t
18c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
18d0: 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63  Hdr PgHdr;.struc
18e0: 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65  t PgHdr {.  Page
18f0: 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1910: 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68  e pager to which
1920: 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e   this page belon
1930: 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
1940: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1950: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1960: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
1970: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1980: 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a  dr *pNextHash, *
1990: 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48  pPrevHash;  /* H
19a0: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
19b0: 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67  ain for PgHdr.pg
19c0: 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  no */.  PgHdr *p
19d0: 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76  NextFree, *pPrev
19e0: 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69  Free;  /* Freeli
19f0: 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72  st of pages wher
1a00: 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50  e nRef==0 */.  P
1a10: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a30: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
1a40: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1a50: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
1a60: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
1a70: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a90: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75  al */.  u8 inJou
1aa0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
1ab0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1ac0: 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  f has been writt
1ad0: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
1ae0: 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20  .  u8 inStmt;   
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20    /* TRUE if in 
1b10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1b20: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38  bjournal */.  u8
1b30: 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20   dirty;         
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 77 65 20 6e 65 65 64 20  TRUE if we need 
1b60: 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68  to write back ch
1b70: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65  anges */.  u8 ne
1b80: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
1b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e            /* Syn
1ba0: 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  c journal before
1bb0: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61   writing this pa
1bc0: 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ge */.  u8 alway
1bd0: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
1be0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
1bf0: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1c00: 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  ) for this page 
1c10: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1c20: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1c30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c40: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1c50: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1c60: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1c70: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1c80: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1c90: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1cb0: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1cd0: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1ce0: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1cf0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1d00: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1d10: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1d20: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1d30: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1d40: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1d50: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1d60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1d70: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1d80: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1d90: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1db0: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1dc0: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1dd0: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1de0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1df0: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1e00: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1e10: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e20: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1e30: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1e40: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1e50: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1e60: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1e70: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1e80: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1e90: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1ea0: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1eb0: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1ec0: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1ed0: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1ee0: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1ef0: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1f00: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1f10: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1f20: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1f30: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1f40: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1f50: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
1f60: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
1f70: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
1f80: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
1f90: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
1fa0: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
1fb0: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
1fc0: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
1fd0: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
1fe0: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
1ff0: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
2000: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
2010: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
2020: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
2030: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
2040: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
2050: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2060: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2070: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
2080: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
2090: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
20a0: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
20b0: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
20c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
20d0: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
20e0: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
20f0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
2100: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
2110: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
2120: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
2130: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
2140: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
2150: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
2160: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
2170: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
2180: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
2190: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
21a0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
21b0: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
21c0: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
21d0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
21e0: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
21f0: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2200: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
2210: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
2220: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2230: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
2240: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
2250: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
2260: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
2270: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
2280: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
2290: 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29  RA(G,P) ((void*)
22a0: 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31  &((char*)(&(G)[1
22b0: 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a  ]))[(P)->pageSiz
22c0: 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  e]).#define PGHD
22d0: 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29  R_TO_HIST(P,PGR)
22e0: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20    \.            
22f0: 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28  ((PgHistory*)&((
2300: 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29  char*)(&(P)[1]))
2310: 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65  [(PGR)->pageSize
2320: 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29  +(PGR)->nExtra])
2330: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
2340: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
2350: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2360: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2370: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
2380: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
2390: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
23a0: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
23b0: 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54  UPT, SQLITE_PROT
23c0: 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OCOL.** or SQLIT
23d0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
23e0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
23f0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
2400: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
2410: 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65  * and is returne
2420: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
2430: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
2440: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
2450: 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  The.** SQLITE_FU
2460: 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  LL return code i
2470: 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  s slightly diffe
2480: 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74  rent. It persist
2490: 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65  s only until the
24a0: 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73  .** next success
24b0: 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  ful rollback is 
24c0: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
24d0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c   pager cache. Al
24e0: 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  so,.** SQLITE_FU
24f0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
2500: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
2510: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
2520: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
2530: 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20  ).** APIs, they 
2540: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  may still be use
2550: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a  d successfully..
2560: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2570: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2580: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2590: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
25a0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
25b0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
25c0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
25d0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
25e0: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
25f0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
2600: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
2610: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2620: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
2630: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2640: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
2650: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2670: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2680: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2690: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
26a0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
26c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
26d0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
26e0: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
26f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2700: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
2710: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
2720: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
2730: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
2740: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
2750: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2760: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2770: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2780: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
27b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
27c0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
27d0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
27e0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
27f0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
2800: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
2810: 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  ess */.  u8 full
2820: 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20  _fsync;         
2830: 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55       /* Use F_FU
2840: 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61  LLFSYNC when ava
2850: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73  ilable */.  u8 s
2860: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
2870: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
2880: 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44  _UNLOCK, _SHARED
2890: 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63  , _RESERVED, etc
28a0: 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  . */.  u8 tempFi
28b0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
28c0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
28d0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
28e0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
28f0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2910: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2920: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
2930: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2940: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2950: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2960: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2970: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2980: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2990: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29a0: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
29b0: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
29c0: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
29d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
29e0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
29f0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
2a00: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
2a10: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2a20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2a30: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2a40: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
2a50: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a70: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a80: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a90: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2aa0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2ac0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2ad0: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2ae0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
2af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2b10: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
2b20: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2b40: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2b50: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
2b60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
2b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b80: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2b90: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
2ba0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2bb0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2be0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
2bf0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2c00: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2c20: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2c30: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2c40: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2c50: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c70: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2c80: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2c90: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2ca0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2cb0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
2cc0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
2cd0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2ce0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
2cf0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2d00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2d10: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
2d20: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2d50: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2d60: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  es */.  int nMax
2d70: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d80: 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65      /* High wate
2d90: 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20  r mark of nPage 
2da0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2dd0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2de0: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2df0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2e20: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2e30: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
2e40: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
2e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e60: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e70: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2e80: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2e90: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2ec0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2ed0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
2ee0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
2ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2f10: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2f20: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2f30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
2f60: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
2f70: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
2f80: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
2f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2fa0: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20  /.  OsFile *fd, 
2fb0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
2fc0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2fd0: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
2fe0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
2ff0: 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20    OsFile *stfd; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3020: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
3030: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
3040: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
3050: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3060: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3070: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3080: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3090: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
30a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
30b0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
30c0: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
30d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
30e0: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
30f0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
3100: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
3110: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3120: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
3130: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3140: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
3150: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3160: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3170: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3180: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
3190: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
31a0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
31b0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
31c0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
31d0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
31e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
31f0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3210: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3230: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
3240: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3250: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
3260: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3280: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
3290: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
32a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
32b0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
32c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
32d0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
32e0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
32f0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3300: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3310: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3320: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3330: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
3340: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3350: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3360: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3370: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
3380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3390: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
33a0: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
33b0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
33c0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
33d0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
33e0: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3400: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3410: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3420: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3430: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
3440: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3450: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3460: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3470: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3480: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3490: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
34a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
34b0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
34c0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
34d0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
34e0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
34f0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
3500: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
3510: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
3520: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3530: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3540: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3550: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3570: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3580: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3590: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
35c0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
35d0: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
35e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35f0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
3600: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
3610: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3620: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
3630: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3640: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3650: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
3660: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
3670: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
3680: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
3690: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
36a0: 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f  .  u32 iChangeCo
36b0: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  unt;           /
36c0: 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e  * Db change-coun
36d0: 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61  ter for which ca
36e0: 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  che is valid */.
36f0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3710: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3720: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3730: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3740: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3750: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3760: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3770: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3780: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3790: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
37a0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
37b0: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
37c0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
37d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f  counter */.};../
37e0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 54  *.** If SQLITE_T
37f0: 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20 74  EST is defined t
3800: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
3810: 65 20 76 61 72 69 61 62 6c 65 20 67 69 76 65 6e  e variable given
3820: 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   in.** the argum
3830: 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ent.*/.#ifdef SQ
3840: 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66 69  LITE_TEST.# defi
3850: 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29 20  ne TEST_INCR(x) 
3860: 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   x++.#else.# def
3870: 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29  ine TEST_INCR(x)
3880: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a  .#endif../*.** J
3890: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
38a0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
38b0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
38c0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
38d0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
38e0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
38f0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3900: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3910: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3920: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3940: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3950: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3960: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3970: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3980: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
39a0: 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  egin.** written,
39b0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
39c0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
39d0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
39e0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
39f0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3a00: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3a10: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3a20: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3a30: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3a40: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3a50: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3a60: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3a70: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3a80: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3a90: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3aa0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3ab0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3ac0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3ae0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3af0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
3b00: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3b10: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3b20: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3b30: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3b40: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3b50: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3b60: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3b70: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3b80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3b90: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3ba0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
3bb0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
3bc0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
3bd0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
3be0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3bf0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3c00: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3c10: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3c20: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3c30: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3c40: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3c50: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3c60: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3c70: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3c80: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
3c90: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
3ca0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
3cb0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
3cc0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
3cd0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
3ce0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
3cf0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
3d00: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
3d10: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
3d20: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
3d30: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
3d40: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
3d50: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
3d60: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
3d70: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
3d80: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
3d90: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
3da0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
3db0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
3dc0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
3dd0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
3de0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
3df0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
3e00: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
3e10: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
3e20: 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  and of each page
3e30: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3e40: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
3e50: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
3e60: 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65  g macros..*/.#de
3e70: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
3e80: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
3e90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
3ea0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
3eb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
3ec0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
3ed0: 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72  er. In the futur
3ee0: 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65  e, this could be
3ef0: 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  .** set to some 
3f00: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
3f10: 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c  the disk control
3f20: 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61  ler. The importa
3f30: 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69  nt.** characteri
3f40: 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20  stic is that it 
3f50: 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  is the same size
3f60: 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f   as a disk secto
3f70: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  r..*/.#define JO
3f80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
3f90: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
3fa0: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
3fb0: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
3fc0: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
3fd0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
3fe0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
3ff0: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
4000: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
4010: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
4020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4030: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
4040: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
4050: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
4060: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
4070: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
4080: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
4090: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
40a0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
40b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
40c0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
40d0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
40e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
40f0: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
4100: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
4110: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47   Page number PAG
4120: 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65  ER_MJ_PGNO is ne
4130: 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53  ver used in an S
4140: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28  QLite database (
4150: 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65  it is.** reserve
4160: 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72  d for working ar
4170: 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70  ound a windows/p
4180: 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69  osix incompatibi
4190: 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20  lity). It is.** 
41a0: 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  used in the jour
41b0: 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  nal to signify t
41c0: 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65  hat the remainde
41d0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
41e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76   file .** is dev
41f0: 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20  oted to storing 
4200: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
4210: 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72   name - there ar
4220: 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20  e no more pages 
4230: 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e  to.** roll back.
4240: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   See comments fo
4250: 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  r function write
4260: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
4270: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
4280: 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52  /* #define PAGER
4290: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
42a0: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
42b0: 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64  pageSize)) */.#d
42c0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
42d0: 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47  GNO(x) ((PENDING
42e0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
42f0: 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  Size))+1)../*.**
4300: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
4310: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
4320: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
4330: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
4340: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
4350: 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  47../*.** Enable
4360: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4370: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
4380: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
4390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
43a0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
43b0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
43c0: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
43d0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
43e0: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
43f0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
4400: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
4410: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
4420: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
4430: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4440: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
4450: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
4460: 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74  %p nRef=%-3d tot
4470: 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
4480: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
4490: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
44a0: 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e  Ref, p->pPager->
44b0: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
44c0: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
44d0: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
44e0: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
44f0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4500: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
4510: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
4520: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
4530: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (X).#endif.../*.
4540: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
4550: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
4560: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e  hash table to N.
4570: 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f    N must be a po
4580: 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a  wer.** of two..*
4590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
45a0: 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
45b0: 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61  table(Pager *pPa
45c0: 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50  ger, int N){.  P
45d0: 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70  gHdr **aHash, *p
45e0: 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  Pg;.  assert( N>
45f0: 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d  0 && (N&(N-1))==
4600: 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73  0 );.  aHash = s
4610: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4620: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
4630: 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d  );.  if( aHash==
4640: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c  0 ){.    /* Fail
4650: 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73  ure to rehash is
4660: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20   not an error.  
4670: 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72  It is only a per
4680: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f  formance hit. */
4690: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
46a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
46b0: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
46c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
46d0: 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  N;.  pPager->aHa
46e0: 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f  sh = aHash;.  fo
46f0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4700: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
4710: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
4720: 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20   int h;.    if( 
4730: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
4740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4750: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
4760: 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
4770: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  h==0 );.      co
4780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
4790: 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20    h = pPg->pgno 
47a0: 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67  & (N-1);.    pPg
47b0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48  ->pNextHash = aH
47c0: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20  ash[h];.    if( 
47d0: 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
47e0: 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65    aHash[h]->pPre
47f0: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
4800: 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20   }.    aHash[h] 
4810: 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e  = pPg;.    pPg->
4820: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
4830: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
4840: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4850: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4860: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4870: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4880: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4890: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
48a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
48b0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
48c0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
48d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
48e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
48f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4900: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4910: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4920: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4930: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4940: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
4950: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4960: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4970: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4980: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4990: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
49a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
49b0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
49c0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
49d0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
49e0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
49f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4a10: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4a20: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
4a30: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
4a40: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
4a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4a60: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
4a70: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
4a80: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4a90: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4aa0: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4ab0: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4ac0: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4ad0: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4ae0: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
4af0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4b00: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
4b10: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4b20: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
4b30: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
4b40: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
4b50: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4b60: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4b80: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4b90: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4ba0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4bb0: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
4bc0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
4bd0: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
4be0: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
4bf0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4c00: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4c10: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4c20: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
4c30: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
4c40: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
4c50: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
4c60: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
4c70: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
4c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4c90: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4ca0: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4cb0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
4cc0: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
4cd0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4ce0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4cf0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4d00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4d10: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4d20: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4d30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4d40: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4d50: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
4d60: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
4d70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
4d80: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4d90: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4da0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4db0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4dc0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4dd0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4de0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4df0: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4e00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4e10: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4e20: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4e30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4e40: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4e50: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4e60: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4e70: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4e80: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4e90: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4ea0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4eb0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4ec0: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4ed0: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4ee0: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4f00: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4f10: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4f20: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
4f30: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
4f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
4f50: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
4f60: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
4f70: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
4f80: 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53    if(.    rc2==S
4f90: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
4fa0: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f    rc2==SQLITE_IO
4fb0: 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d  ERR ||.    rc2==
4fc0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
4fd0: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
4fe0: 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b 0a  E_PROTOCOL.  ){.
4ff0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
5000: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20 20  ode = rc;.  }.  
5010: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
5020: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
5030: 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65  K_PAGES./*.** Re
5040: 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61  turn a 32-bit ha
5050: 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64  sh of the page d
5060: 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a  ata for pPage..*
5070: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
5080: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
5090: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32  r *pPage){.  u32
50a0: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
50b0: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
50c0: 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e  har *pData = (un
50d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47  signed char *)PG
50e0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67  HDR_TO_DATA(pPag
50f0: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
5100: 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e  <pPage->pPager->
5110: 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a  pageSize; i++){.
5120: 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
5130: 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20  +i)^pData[i];.  
5140: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
5150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5160: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
5170: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
5180: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
5190: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
51a0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
51b0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
51c0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
51d0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
51e0: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
51f0: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5200: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5210: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5220: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5230: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5240: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5250: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5260: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
5270: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5280: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
5290: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
52a0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
52b0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
52c0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
52d0: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
52e0: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
52f0: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
5300: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
5310: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
5320: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5330: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
5340: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
5350: 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ed the journal f
5360: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50  ile for pager pP
5370: 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65  ager must be ope
5380: 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  n..** The master
5390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
53a0: 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  me is read from 
53b0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
53c0: 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74  ile and .** writ
53d0: 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
53e0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
53f0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70  liteMalloc(). *p
5400: 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65  zMaster is.** se
5410: 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  t to point at th
5420: 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  e memory and SQL
5430: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
5440: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5450: 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29  .** sqliteFree()
5460: 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a   *pzMaster..**.*
5470: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
5480: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
5490: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d   is present *pzM
54a0: 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20  aster is set to 
54b0: 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  0 and.** SQLITE_
54c0: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
54d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d  static int readM
54e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46  asterJournal(OsF
54f0: 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72  ile *pJrnl, char
5500: 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20   **pzMaster){.  
5510: 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65  int rc;.  u32 le
5520: 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20  n;.  i64 szJ;.  
5530: 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74  u32 cksum;.  int
5540: 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   i;.  unsigned c
5550: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
5560: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
5570: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
5580: 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73  der */..  *pzMas
5590: 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  ter = 0;..  rc =
55a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
55b0: 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b  ze(pJrnl, &szJ);
55c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
55d0: 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29  E_OK || szJ<16 )
55e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
55f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
5600: 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29  k(pJrnl, szJ-16)
5610: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5620: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5630: 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64  c;. .  rc = read
5640: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c  32bits(pJrnl, &l
5650: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5660: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5670: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
5680: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
5690: 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72  &cksum);.  if( r
56a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
56b0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
56c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
56d0: 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38  pJrnl, aMagic, 8
56e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
56f0: 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70  ITE_OK || memcmp
5700: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
5710: 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74  lMagic, 8) ) ret
5720: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5730: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
5740: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  rnl, szJ-16-len)
5750: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5760: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5770: 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  c;..  *pzMaster 
5780: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
5790: 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20  Malloc(len+1);. 
57a0: 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20   if( !*pzMaster 
57b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
57c0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
57d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
57e0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d  Read(pJrnl, *pzM
57f0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
5800: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5810: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
5820: 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20  ee(*pzMaster);. 
5830: 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30     *pzMaster = 0
5840: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
5850: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69  .  }..  /* See i
5860: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d  f the checksum m
5870: 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65  atches the maste
5880: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
5890: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  /.  for(i=0; i<l
58a0: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
58b0: 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65  sum -= (*pzMaste
58c0: 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  r)[i];.  }.  if(
58d0: 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a   cksum ){.    /*
58e0: 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   If the checksum
58f0: 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c   doesn't add up,
5900: 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   then one or mor
5910: 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65  e of the disk se
5920: 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e  ctors.    ** con
5930: 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74  taining the mast
5940: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er journal filen
5950: 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ame is corrupted
5960: 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20  . This means.   
5970: 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72   ** definitely r
5980: 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73  oll back, so jus
5990: 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
59a0: 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20  OK and report a 
59b0: 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73  (nul).    ** mas
59c0: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
59d0: 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  name..    */.   
59e0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
59f0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
5a00: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c  aster = 0;.  }el
5a10: 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74  se{.    (*pzMast
5a20: 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  er)[len] = '\0';
5a30: 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72  .  }.   .  retur
5a40: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
5a50: 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a  /*.** Seek the j
5a60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
5a70: 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  riptor to the ne
5a80: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
5a90: 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f  ry where a.** jo
5aa0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79  urnal header may
5ab0: 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74   be read or writ
5ac0: 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e  ten. Pager.journ
5ad0: 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64  alOff is updated
5ae0: 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77   with.** the new
5af0: 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a   seek offset..**
5b00: 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65  .** i.e for a se
5b10: 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32  ctor size of 512
5b20: 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66  :.**.** Input Of
5b30: 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
5b40: 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a    Output Offset.
5b50: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20  ----------.** 0 
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32          0.** 512
5ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bb0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30         512.** 10
5bc0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
5bd0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32          512.** 2
5be0: 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  000             
5bf0: 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a           2048.**
5c00: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
5c10: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50  seekJournalHdr(P
5c20: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
5c30: 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
5c40: 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65  .  i64 c = pPage
5c50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5c60: 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66   if( c ){.    of
5c70: 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f  fset = ((c-1)/JO
5c80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5c90: 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52  ger) + 1) * JOUR
5ca0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5cb0: 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  r);.  }.  assert
5cc0: 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c  ( offset%JOURNAL
5cd0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
5ce0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5cf0: 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61  offset>=c );.  a
5d00: 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63  ssert( (offset-c
5d10: 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  )<JOURNAL_HDR_SZ
5d20: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50  (pPager) );.  pP
5d30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5d40: 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74   = offset;.  ret
5d50: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65  urn sqlite3OsSee
5d60: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
5d70: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d80: 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  f);.}../*.** The
5d90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75   journal file mu
5da0: 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20  st be open when 
5db0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5dc0: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5dd0: 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55  l.** header (JOU
5de0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5df0: 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  s) is written in
5e00: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
5e10: 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75  ile at the.** cu
5e20: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a  rrent location..
5e30: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74  **.** The format
5e40: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
5e50: 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f   header is as fo
5e60: 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79  llows:.** - 8 by
5e70: 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74  tes: Magic ident
5e80: 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  ifying journal f
5e90: 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  ormat..** - 4 by
5ea0: 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72  tes: Number of r
5eb0: 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61  ecords in journa
5ec0: 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63  l, or -1 no-sync
5ed0: 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20   mode is on..** 
5ee0: 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f  - 4 bytes: Rando
5ef0: 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f  m number used fo
5f00: 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20  r page hash..** 
5f10: 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69  - 4 bytes: Initi
5f20: 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65  al database page
5f30: 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62   count..** - 4 b
5f40: 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a  ytes: Sector siz
5f50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72  e used by the pr
5f60: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
5f70: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a   this journal..*
5f80: 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62  * .** Followed b
5f90: 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  y (JOURNAL_HDR_S
5fa0: 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66  Z - 24) bytes of
5fb0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a   unused space..*
5fc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
5fd0: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  teJournalHdr(Pag
5fe0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 63  er *pPager){.  c
5ff0: 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a 65  har zHeader[size
6000: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6010: 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  )+16];.  int rc;
6020: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
6030: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
6040: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
6050: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
6060: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
6070: 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  }..  rc = seekJo
6080: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6090: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
60a0: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
60b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
60c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
60d0: 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ff;.  pPager->jo
60e0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
60f0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6100: 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45  r);..  /* FIX ME
6110: 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73  : .  **.  ** Pos
6120: 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65  sibly for a page
6130: 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63  r not in no-sync
6140: 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e   mode, the journ
6150: 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20  al magic should 
6160: 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74  not.  ** be writ
6170: 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69  ten until nRec i
6180: 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70  s filled in as p
6190: 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63  art of next sync
61a0: 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a  Journal(). .  **
61b0: 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d  .  ** Actually m
61c0: 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a  aybe the whole j
61d0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68  ournal header sh
61e0: 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20  ould be delayed 
61f0: 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20  until that.  ** 
6200: 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f  point. Think abo
6210: 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20  ut this..  */.  
6220: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
6230: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6240: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6250: 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65 20  gic));.  /* The 
6260: 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46  nRec Field. 0xFF
6270: 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79  FFFFFF for no-sy
6280: 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a  nc journals. */.
6290: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
62a0: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
62b0: 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50 61  rnalMagic)], pPa
62c0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78  ger->noSync ? 0x
62d0: 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20  ffffffff : 0);. 
62e0: 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63   /* The random c
62f0: 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61  heck-hash initia
6300: 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69  liser */ .  sqli
6310: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69  te3Randomness(si
6320: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
6330: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
6340: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6350: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
6360: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
6370: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
6380: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
6390: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
63a0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
63b0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
63c0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
63d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
63e0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
63f0: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73 75  );.  /* The assu
6400: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
6410: 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73  for this process
6420: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
6430: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6440: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
6450: 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74  2], pPager->sect
6460: 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52 41  orSize);.  IOTRA
6470: 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
6480: 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
6490: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
64a0: 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61  Hdr, sizeof(zHea
64b0: 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73 71  der))).  rc = sq
64c0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
64d0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
64e0: 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65  r, sizeof(zHeade
64f0: 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a  r));..  /* The j
6500: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68 61  ournal header ha
6510: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 73  s been written s
6520: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65 65  uccessfully. See
6530: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  k the journal.  
6540: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
6550: 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  or to the end of
6560: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6570: 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f  der sector..  */
6580: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6590: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52  E_OK ){.    IOTR
65a0: 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20 25  ACE(("JTAIL %p %
65b0: 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20  lld\n", pPager, 
65c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
65d0: 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d 20  ff-1)).    rc = 
65e0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
65f0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6600: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6610: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
6620: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6630: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
6640: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
6650: 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20  , "\000", 1);.  
6660: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6670: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6680: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6690: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
66a0: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
66b0: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
66c0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
66d0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
66e0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
66f0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
6700: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
6710: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
6720: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
6730: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
6740: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
6750: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
6760: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6770: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6780: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6790: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
67a0: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
67b0: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
67c0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
67d0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
67e0: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
67f0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
6800: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
6810: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
6820: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
6830: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
6840: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
6850: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
6860: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
6870: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6880: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6890: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
68a0: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
68b0: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
68c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
68d0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
68e0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
68f0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
6900: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
6910: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
6920: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
6930: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
6940: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
6950: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
6960: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6970: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6980: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6990: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
69a0: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
69b0: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
69c0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
69d0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
69e0: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
69f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
6a00: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
6a10: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6a20: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6a30: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6a40: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6a50: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6a60: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6a70: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6a80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6a90: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6aa0: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6ab0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
6ac0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
6ad0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6ae0: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
6af0: 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65  fd, aMagic, size
6b00: 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69  of(aMagic));.  i
6b10: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6b20: 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  c;..  if( memcmp
6b30: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
6b40: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
6b50: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
6b60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6b70: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
6b80: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
6b90: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
6ba0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6bb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6bc0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6bd0: 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
6be0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
6bf0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c00: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
6c10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6c20: 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69  d, pDbSize);.  i
6c30: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6c40: 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  c;..  /* Update 
6c50: 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  the assumed sect
6c60: 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68  or-size to match
6c70: 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20   the value used 
6c80: 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f  by .  ** the pro
6c90: 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65  cess that create
6ca0: 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20  d this journal. 
6cb0: 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  If this journal 
6cc0: 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64  was.  ** created
6cd0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74   by a process ot
6ce0: 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e  her than this on
6cf0: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  e, then this rou
6d00: 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69  tine.  ** is bei
6d10: 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77  ng called from w
6d20: 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79  ithin pager_play
6d30: 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61  back(). The loca
6d40: 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20  l value.  ** of 
6d50: 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65  Pager.sectorSize
6d60: 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20   is restored at 
6d70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20  the end of that 
6d80: 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  routine..  */.  
6d90: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6da0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33  pPager->jfd, (u3
6db0: 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63  2 *)&pPager->sec
6dc0: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  torSize);.  if( 
6dd0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6de0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6df0: 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c  alOff += JOURNAL
6e00: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
6e10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6e20: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6e30: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6e40: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6e50: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6e60: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6e70: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6e80: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6e90: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6ea0: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6eb0: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6ec0: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
6ed0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6ee0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
6ef0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
6f00: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
6f10: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
6f20: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6f30: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6f40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6f50: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6f60: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6f70: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
6f80: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
6f90: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
6fa0: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
6fb0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
6fc0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
6fd0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
6fe0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
6ff0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
7000: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
7010: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
7020: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
7030: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
7040: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
7050: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
7060: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
7070: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
7080: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
7090: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
70a0: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
70b0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61  me..**.** If zMa
70c0: 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70  ster is a NULL p
70d0: 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66  ointer (occurs f
70e0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
70f0: 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
7100: 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c  ), .** this call
7110: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
7120: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7130: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61  MasterJournal(Pa
7140: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
7150: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
7160: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
7170: 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69  nt len; .  int i
7180: 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ; .  u32 cksum =
7190: 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
71a0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
71b0: 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69  agic)+2*4];..  i
71c0: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
71d0: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
71e0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
71f0: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
7200: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
7210: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
7220: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
7230: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
7240: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
7250: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
7260: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
7270: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
7280: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
7290: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
72a0: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
72b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
72c0: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
72d0: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
72e0: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
72f0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
7300: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
7310: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
7320: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
7330: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
7340: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
7350: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
7360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7370: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
7380: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
7390: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
73a0: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
73b0: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
73c0: 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  >jfd, PAGER_MJ_P
73d0: 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
73e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
73f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
7400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7410: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7420: 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29  d, zMaster, len)
7430: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
7440: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
7450: 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  c;..  put32bits(
7460: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
7470: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
7480: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
7490: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
74a0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
74b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
74c0: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
74d0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
74e0: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
74f0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7500: 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  gic));.  pPager-
7510: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
7520: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72  ger->noSync;.  r
7530: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
7540: 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65  ** Add or remove
7550: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
7560: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   list of all pag
7570: 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74  es that are in t
7580: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
7590: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
75a0: 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61  he Pager keeps a
75b0: 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f   separate list o
75c0: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
75d0: 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a   currently in.**
75e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
75f0: 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65  ournal.  This he
7600: 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50  lps the sqlite3P
7610: 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29  agerStmtCommit()
7620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
7630: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
7640: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
7650: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
7660: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
7670: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
7680: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
7690: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
76a0: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
76b0: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
76c0: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
76d0: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
76e0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
76f0: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
7700: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7710: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
7720: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
7730: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
7740: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
7750: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
7760: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
7770: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
7780: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7790: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
77a0: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
77b0: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
77c0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
77d0: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
77e0: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
77f0: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
7800: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
7810: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
7820: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
7830: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
7840: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
7850: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
7860: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
7870: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
7880: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
7890: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
78a0: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
78b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
78c0: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
78d0: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
78e0: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
78f0: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
7900: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
7910: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
7920: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7930: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
7940: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
7950: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
7960: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
7970: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
7980: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
7990: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
79a0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
79b0: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
79c0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
79d0: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
79e0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
79f0: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7a00: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7a10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7a20: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
7a30: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
7a40: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
7a50: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
7a60: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
7a70: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a  o){.  PgHdr *p;.
7a80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
7a90: 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ash==0 ) return 
7aa0: 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d  0;.  p = pPager-
7ab0: 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70  >aHash[pgno & (p
7ac0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
7ad0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
7ae0: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
7af0: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
7b00: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
7b10: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7b20: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
7b30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
7b40: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
7b50: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
7b60: 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
7b70: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
7b80: 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d  de ){.    if( !M
7b90: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
7ba0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50  lite3OsUnlock(pP
7bb0: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
7bc0: 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  K);.      pPager
7bd0: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
7be0: 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55       IOTRACE(("U
7bf0: 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61  NLOCK %p\n", pPa
7c00: 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20  ger)).    }.    
7c10: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
7c20: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
7c30: 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65    pPager->change
7c40: 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20  CountDone = 0;. 
7c50: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63   }.}../*.** Exec
7c60: 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ute a rollback i
7c70: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
7c80: 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e  is active and un
7c90: 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74  lock the .** dat
7ca0: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73  abase file. This
7cb0: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74   is a no-op if t
7cc0: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
7cd0: 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20  eady entered.** 
7ce0: 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e  the error-state.
7cf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7d00: 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
7d10: 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29  llback(Pager *p)
7d20: 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f  {.  if( p->errCo
7d30: 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  de ) return;.  a
7d40: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
7d50: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
7d60: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
7d70: 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  n==0 );.  if( p-
7d80: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
7d90: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71  SERVED ){.    sq
7da0: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
7db0: 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67  ck(p);.  }.  pag
7dc0: 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20  er_unlock(p);.  
7dd0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
7de0: 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61  de || !p->journa
7df0: 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63  lOpen || (p->exc
7e00: 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e  lusiveMode&&!p->
7e10: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20  journalOff) );. 
7e20: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
7e30: 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f  ode || !p->stmtO
7e40: 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73  pen || p->exclus
7e50: 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f  iveMode );.}.../
7e60: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7e70: 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c 65  database and cle
7e80: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
7e90: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
7ea0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
7eb0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
7ec0: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
7ed0: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
7ee0: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
7ef0: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
7f00: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
7f10: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
7f20: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
7f30: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
7f40: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
7f50: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
7f60: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
7f70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7f80: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
7f90: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
7fa0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
7fb0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
7fc0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
7fd0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
7fe0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7ff0: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  g=pNext){.    pN
8000: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
8010: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
8020: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
8030: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
8040: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
8050: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
8060: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
8070: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
8080: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
8090: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
80a0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
80b0: 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  0;.  sqliteFree(
80c0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
80d0: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
80e0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
80f0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67  Hash = 0;.  pPag
8100: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a  er->nRef = 0;.}.
8110: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8120: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8130: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
8140: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
8150: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
8160: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
8170: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
8180: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
8190: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61  is routine relea
81a0: 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ses.** the datab
81b0: 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71  ase lock and acq
81c0: 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c  uires a SHARED l
81d0: 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65  ock in its place
81e0: 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  .  The journal.*
81f0: 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65  * file is delete
8200: 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a  d and closed..**
8210: 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64  .** TODO: Consid
8220: 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a  er keeping the j
8230: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8240: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   for temporary d
8250: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69  atabases..** Thi
8260: 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70  s might give a p
8270: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f  erformance impro
8280: 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77  vement on window
8290: 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a  s where opening.
82a0: 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20  ** a file is an 
82b0: 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
82c0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
82d0: 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65  nt pager_unwrite
82e0: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
82f0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
8300: 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
8310: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
8320: 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
8330: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
8340: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
8350: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
8360: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
8370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8380: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67    }.  sqlite3Pag
8390: 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
83a0: 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
83b0: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20  er->stmtOpen && 
83c0: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
83d0: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  veMode ){.    sq
83e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
83f0: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
8400: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
8410: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
8420: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8430: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
8440: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
8450: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72  eMode ){.      r
8460: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
8470: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
8480: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  d, 0);.      sql
8490: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
84a0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
84b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
84c0: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
84d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
84e0: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
84f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
8500: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
8510: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
8520: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8530: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
8540: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
8550: 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 72 20  temporary pager 
8560: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  file, then the j
8570: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 75  ournal file shou
8580: 6c 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 76 65  ld.      ** have
8590: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
85a0: 20 61 73 20 64 65 6c 65 74 65 2d 6f 6e 2d 63 6c   as delete-on-cl
85b0: 6f 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ose. Otherwise, 
85c0: 69 74 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 0a  it should still.
85d0: 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6e 20 74        ** be in t
85e0: 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20  he file system. 
85f0: 54 68 69 73 20 70 61 67 65 72 20 73 74 69 6c 6c  This pager still
8600: 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
8610: 44 20 6f 72 20 67 72 65 61 74 65 72 0a 20 20 20  D or greater.   
8620: 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68     ** lock on th
8630: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
8640: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
8650: 63 68 61 6e 63 65 20 61 6e 6f 74 68 65 72 20 70  chance another p
8660: 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a 20  rocess.      ** 
8670: 63 6f 75 6c 64 20 63 72 65 61 74 65 20 6f 72 20  could create or 
8680: 72 65 6d 6f 76 65 20 61 20 6a 6f 75 72 6e 61 6c  remove a journal
8690: 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a   file..      */.
86a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
86b0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
86c0: 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
86d0: 61 6c 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  al) || pPager->t
86e0: 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
86f0: 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
8700: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
8710: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
8720: 7c 7c 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  || !pPager->temp
8730: 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
8740: 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
8750: 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
8760: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
8770: 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
8780: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rnal);.      }. 
8790: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46     }.    sqliteF
87a0: 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
87b0: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70  Journal );.    p
87c0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
87d0: 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70  l = 0;.    for(p
87e0: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
87f0: 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
8800: 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
8810: 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
8820: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64   0;.      pPg->d
8830: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
8840: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
8850: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c  0;.      pPg->al
8860: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
8870: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
8880: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
8890: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
88a0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
88b0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
88c0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
88d0: 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
88e0: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
88f0: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
8900: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
8910: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8920: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
8930: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
8940: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8950: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
8960: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
8970: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  nal==0 );.  }.. 
8980: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
8990: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
89a0: 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
89b0: 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
89c0: 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
89d0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
89e0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
89f0: 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  RED;.  }else if(
8a00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
8a10: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a  PAGER_SYNCED ){.
8a20: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
8a30: 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
8a40: 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  IVE;.  }.  pPage
8a50: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
8a60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
8a70: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
8a80: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
8a90: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
8aa0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
8ab0: 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ger->pFirst;.  p
8ac0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8ad0: 2d 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72  -1;..  return (r
8ae0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32  c==SQLITE_OK?rc2
8af0: 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  :rc);.}../*.** C
8b00: 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72  ompute and retur
8b10: 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72  n a checksum for
8b20: 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74   the page of dat
8b30: 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  a..**.** This is
8b40: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
8b50: 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61  ksum.  It is rea
8b60: 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d  lly just the sum
8b70: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64   of the .** rand
8b80: 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  om initial value
8b90: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75   and the page nu
8ba0: 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69  mber.  We experi
8bb0: 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61  mented with.** a
8bc0: 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65   checksum of the
8bd0: 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75   entire data, bu
8be0: 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64  t that was found
8bf0: 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e   to be too slow.
8c00: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
8c10: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
8c20: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8c30: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
8c40: 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ata and.** the c
8c50: 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65  hecksum is store
8c60: 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54  d at the end.  T
8c70: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
8c80: 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  .  If journal.**
8c90: 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75   corruption occu
8ca0: 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65  rs due to a powe
8cb0: 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d  r failure, the m
8cc0: 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61  ost likely scena
8cd0: 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f  rio.** is that o
8ce0: 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74  ne end or the ot
8cf0: 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72  her of the recor
8d00: 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65  d will be change
8d10: 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63  d.  It is.** muc
8d20: 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68  h less likely th
8d30: 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20  at the two ends 
8d40: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  of the journal r
8d50: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a  ecord will be.**
8d60: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65   correct and the
8d70: 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75   middle be corru
8d80: 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20  pt.  Thus, this 
8d90: 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d  "checksum" schem
8da0: 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73  e,.** though fas
8db0: 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61  t and simple, ca
8dc0: 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79  tches the mostly
8dd0: 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20   likely kind of 
8de0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a  corruption..**.*
8df0: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69  * FIX ME:  Consi
8e00: 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79  der adding every
8e10: 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62   200th (or so) b
8e20: 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  yte of the data 
8e30: 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73  to the.** checks
8e40: 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66  um.  That way if
8e50: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73   a single page s
8e60: 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64  pans 3 or more d
8e70: 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a  isk sectors and.
8e80: 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64  ** only the midd
8e90: 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72  le sector is cor
8ea0: 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74  rupt, we will st
8eb0: 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f  ill have a reaso
8ec0: 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20  nable.** chance 
8ed0: 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63  of failing the c
8ee0: 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73  hecksum and thus
8ef0: 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70   detecting the p
8f00: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69  roblem..*/.stati
8f10: 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75  c u32 pager_cksu
8f20: 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  m(Pager *pPager,
8f30: 20 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61   const u8 *aData
8f40: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
8f50: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
8f60: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
8f70: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
8f80: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
8f90: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
8fa0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
8fb0: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
8fc0: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
8fd0: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
8fe0: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
8ff0: 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28   void makeClean(
9000: 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  PgHdr*);../*.** 
9010: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
9020: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
9030: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
9040: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
9050: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
9060: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
9070: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
9080: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
9090: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
90a0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
90b0: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
90c0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
90d0: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
90e0: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
90f0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9100: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
9110: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
9120: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
9130: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
9140: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
9150: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
9160: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
9170: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
9180: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
9190: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
91a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
91b0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
91c0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
91d0: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
91f0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
9200: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
9210: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
9220: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
9230: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
9240: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
9250: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
9260: 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38   u8 *aData = (u8
9270: 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53   *)pPager->pTmpS
9280: 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20  pace;   /* Temp 
9290: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
92a0: 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43  ge */..  /* useC
92b0: 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74  ksum should be t
92c0: 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  rue for the main
92d0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c   journal and fal
92e0: 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74  se for.  ** stat
92f0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20  ement journals. 
9300: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
9310: 73 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  s is always the 
9320: 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65  case.  */.  asse
9330: 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43  rt( jfd == (useC
9340: 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a  ksum ? pPager->j
9350: 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66  fd : pPager->stf
9360: 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  d) );.  assert( 
9370: 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d  aData );..  rc =
9380: 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c   read32bits(jfd,
9390: 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72   &pgno);.  if( r
93a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
93b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
93c0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a   sqlite3OsRead(j
93d0: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
93e0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
93f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9400: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
9410: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9420: 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  Off += pPager->p
9430: 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20  ageSize + 4;..  
9440: 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
9450: 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ng on the page. 
9460: 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d   This is more im
9470: 70 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f  portant that I o
9480: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74  riginally.  ** t
9490: 68 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f  hought.  If a po
94a0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
94b0: 72 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  rs while the jou
94c0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72  rnal is being wr
94d0: 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63  itten,.  ** it c
94e0: 6f 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c  ould cause inval
94f0: 69 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72  id data to be wr
9500: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
9510: 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64  ournal.  We need
9520: 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20   to.  ** detect 
9530: 74 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74  this invalid dat
9540: 61 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f  a (with high pro
9550: 62 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67  bability) and ig
9560: 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  nore it..  */.  
9570: 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70  if( pgno==0 || p
9580: 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
9590: 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
95a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
95b0: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20  DONE;.  }.  if( 
95c0: 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70  pgno>(unsigned)p
95d0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
95e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
95f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
9600: 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20   useCksum ){.   
9610: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
9620: 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  (jfd, &cksum);. 
9630: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
9640: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
9650: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
9660: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
9670: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
9680: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
9690: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
96a0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
96b0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
96c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
96d0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
96e0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
96f0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
9700: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
9710: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
9720: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
9730: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
9740: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
9750: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
9760: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
9770: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
9780: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
9790: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
97a0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
97b0: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
97c0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
97d0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
97e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58  **.  ** If in EX
97f0: 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74  CLUSIVE state, t
9800: 68 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68  hen we update th
9810: 65 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66  e pager cache if
9820: 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20   it exists.  ** 
9830: 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  and the main fil
9840: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74  e. The page is t
9850: 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64  hen marked not d
9860: 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  irty..  **.  ** 
9870: 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54  Ticket #1171:  T
9880: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
9890: 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61  rnal might conta
98a0: 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  in page content 
98b0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66  that is.  ** dif
98c0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
98d0: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20  page content at 
98e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
98f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
9900: 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77  ** This occurs w
9910: 68 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68  hen a page is ch
9920: 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74  anged prior to t
9930: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74  he start of a st
9940: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  atement.  ** the
9950: 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20  n changed again 
9960: 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
9970: 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c  ment.  When roll
9980: 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a  ing back such a.
9990: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
99a0: 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65  e must not write
99b0: 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   to the original
99c0: 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73   database unless
99d0: 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f   we know.  ** fo
99e0: 72 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f  r certain that o
99f0: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
9a00: 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65  tents are in the
9a10: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
9a20: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
9a30: 68 65 72 77 69 73 65 2c 20 69 66 20 61 20 66 75  herwise, if a fu
9a40: 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75  ll ROLLBACK occu
9a50: 72 73 20 61 66 74 65 72 20 74 68 65 20 73 74 61  rs after the sta
9a60: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c  tement.  ** roll
9a70: 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f  back the full RO
9a80: 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20  LLBACK will not 
9a90: 72 65 73 74 6f 72 65 20 74 68 65 20 70 61 67 65  restore the page
9aa0: 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
9ab0: 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20  .  ** content.  
9ac0: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
9ad0: 75 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72  ust be met befor
9ae0: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
9af0: 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66   database.  ** f
9b00: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
9b10: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c  tabase must be l
9b20: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
9b30: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
9b40: 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20  ginal.  ** page 
9b50: 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68  content is in th
9b60: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65  e main journal e
9b70: 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68  ither because th
9b80: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
9b90: 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65  .  ** cache or e
9ba0: 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64  lse it is marked
9bb0: 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e   as needSync==0.
9bc0: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
9bd0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
9be0: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
9bf0: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9c00: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
9c10: 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a  VE || pPg!=0 );.
9c20: 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 50    PAGERTRACE3("P
9c30: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
9c40: 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
9c50: 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20  Pager), pgno);. 
9c60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
9c70: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9c80: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
9c90: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
9ca0: 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
9cb0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
9cc0: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
9cd0: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
9ce0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9cf0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
9d00: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
9d10: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
9d20: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
9d30: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9d40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
9d50: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
9d60: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
9d70: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
9d80: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
9d90: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
9da0: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
9db0: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
9dc0: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
9dd0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
9de0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
9df0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
9e00: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
9e10: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
9e20: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
9e30: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
9e40: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
9e50: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
9e60: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
9e70: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
9e80: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
9e90: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
9ea0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
9eb0: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
9ec0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
9ed0: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
9ee0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
9ef0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
9f00: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
9f10: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
9f20: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
9f30: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
9f40: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9f50: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
9f60: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
9f70: 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58  tor ){  /*** FIX
9f80: 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69   ME:  Should thi
9f90: 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a  s be xReinit? **
9fa0: 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  */.      pPager-
9fb0: 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50 67  >xDestructor(pPg
9fc0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
9fd0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
9fe0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
9ff0: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
a000: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a010: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a020: 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 31 28  ndif.    CODEC1(
a030: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
a040: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 0a 20  Pg->pgno, 3);.. 
a050: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
a060: 73 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72  s page 1, then r
a070: 65 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65  estore the value
a080: 20 6f 66 20 50 61 67 65 72 2e 69 43 68 61 6e 67   of Pager.iChang
a090: 65 43 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66  eCount */.    if
a0a0: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
a0b0: 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e     pPager->iChan
a0c0: 67 65 43 6f 75 6e 74 20 3d 20 72 65 74 72 69 65  geCount = retrie
a0d0: 76 65 33 32 62 69 74 73 28 70 50 67 2c 20 32 34  ve32bits(pPg, 24
a0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a0f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a100: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
a110: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
a120: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
a130: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
a140: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
a150: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
a160: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
a170: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
a180: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
a190: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
a1a0: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
a1b0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
a1c0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
a1d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a1e0: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
a1f0: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
a200: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
a210: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
a220: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
a230: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
a240: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
a250: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
a260: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
a270: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
a280: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
a290: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
a2a0: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
a2b0: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
a2c0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
a2d0: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
a2e0: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
a2f0: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
a300: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
a310: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
a320: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
a330: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
a340: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
a350: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
a360: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
a370: 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a  le *master = 0;.
a380: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
a390: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
a3a0: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
a3b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a3c0: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
a3d0: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
a3e0: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
a3f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
a400: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
a410: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a420: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
a430: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
a440: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
a450: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
a460: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
a470: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
a480: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
a490: 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ce..  */.  rc = 
a4a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
a4b0: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
a4c0: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
a4d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
a4e0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a4f0: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
a500: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
a510: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d  ite3OsFileSize(m
a520: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
a530: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
a540: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
a550: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a560: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
a570: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
a580: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
a590: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
a5a0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
a5b0: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
a5c0: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
a5d0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
a5e0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
a5f0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
a600: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
a610: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
a620: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
a630: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
a640: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
a650: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
a660: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
a670: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
a680: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
a690: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
a6a0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
a6b0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
a6c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a6d0: 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a  OsRead(master, z
a6e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e  MasterJournal, n
a6f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a700: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a710: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
a720: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20  master_out;..   
a730: 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73   zJournal = zMas
a740: 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  terJournal;.    
a750: 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c  while( (zJournal
a760: 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  -zMasterJournal)
a770: 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  <nMasterJournal 
a780: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
a790: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
a7a0: 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20  (zJournal) ){.  
a7b0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
a7c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69  the journals poi
a7d0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d  nted to by the m
a7e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78  aster journal ex
a7f0: 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ists..        **
a800: 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65   Open it and che
a810: 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20  ck if it points 
a820: 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  at the master jo
a830: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20  urnal. If.      
a840: 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20    ** so, return 
a850: 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67  without deleting
a860: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a870: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
a880: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46    */.        OsF
a890: 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30  ile *journal = 0
a8a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b  ;.        int c;
a8b0: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ..        rc = s
a8c0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
a8d0: 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26  Only(zJournal, &
a8e0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
a8f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a900: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
a910: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a920: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
a930: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61          rc = rea
a940: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a  dMasterJournal(j
a950: 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72  ournal, &zMaster
a960: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Ptr);.        sq
a970: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f  lite3OsClose(&jo
a980: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  urnal);.        
a990: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
a9a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
a9b0: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
a9c0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
a9d0: 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65        c = zMaste
a9e0: 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d  rPtr!=0 && strcm
a9f0: 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
aa00: 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
aa10: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
aa20: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
aa30: 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
aa40: 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
aa50: 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
aa60: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
aa70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
aa80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
aa90: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
aaa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
aab0: 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
aac0: 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a  al += (strlen(zJ
aad0: 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20  ournal)+1);.    
aae0: 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20  }.  }.  .  rc = 
aaf0: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
ab00: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
ab10: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
ab20: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
ab30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
ab40: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
ab50: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
ab60: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
ab70: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ab80: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
ab90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
aba0: 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  f 0./*.** Make e
abb0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
abc0: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
abd0: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
abe0: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
abf0: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
ac00: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
ac10: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
ac20: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
ac30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
ac40: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
ac50: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
ac60: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
ac70: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
ac80: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
ac90: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
aca0: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
acb0: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
acc0: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
acd0: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
ace0: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
acf0: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
ad00: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
ad10: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
ad20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ad30: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
ad40: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
ad50: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ad60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ad70: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
ad80: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
ad90: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
ada0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
adb0: 20 2a 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d   *zBuf = pPager-
adc0: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20  >pTmpSpace;     
add0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
ade0: 67 65 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20  ge for one page 
adf0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
ae00: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
ae10: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
ae20: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
ae30: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
ae40: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
ae50: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
ae60: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
ae70: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70  pageSize*(i64)(p
ae80: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
ae90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
aea0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
aeb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
aec0: 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
aed0: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
aee0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
aef0: 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
af00: 45 33 28 22 52 45 46 45 54 43 48 20 25 64 20 70  E3("REFETCH %d p
af10: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
af20: 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
af30: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
af40: 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
af50: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
af60: 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67  r, zBuf, pPg->pg
af70: 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73  no, 2);.    }els
af80: 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
af90: 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d  zBuf, 0, pPager-
afa0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
afb0: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  }.    if( pPg->n
afc0: 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  Ref==0 || memcmp
afd0: 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f  (zBuf, PGHDR_TO_
afe0: 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
aff0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a  r->pageSize) ){.
b000: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
b010: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
b020: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
b030: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
b040: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
b050: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
b060: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
b070: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
b080: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
b090: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b0a0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
b0b0: 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
b0c0: 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
b0d0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
b0e0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
b0f0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
b100: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
b110: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
b120: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
b130: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
b140: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
b150: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  g);.#endif.  }. 
b160: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
b170: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
b180: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
b190: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
b1a0: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
b1b0: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
b1c0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
b1d0: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
b1e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
b1f0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
b200: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
b210: 20 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72   nPage){.  asser
b220: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
b230: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
b240: 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  E );.  return sq
b250: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
b260: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
b270: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
b280: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
b290: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
b2a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
b2b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
b2c0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
b2d0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
b2e0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
b2f0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
b300: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
b310: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b320: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
b330: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
b340: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
b350: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
b360: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
b370: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
b380: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b390: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b3a0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
b3b0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
b3c0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
b3d0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
b3e0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
b3f0: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
b400: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
b410: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
b420: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
b430: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
b440: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b450: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b460: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
b470: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
b480: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
b490: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
b4a0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
b4b0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
b4c0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b4d0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
b4e0: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
b4f0: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
b500: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
b510: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
b520: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
b530: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b540: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b550: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
b560: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
b570: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
b580: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
b590: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
b5a0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
b5b0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
b5c0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
b5d0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
b5e0: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
b5f0: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
b600: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
b610: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
b620: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
b630: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
b640: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
b650: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
b660: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
b670: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
b680: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
b690: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
b6a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
b6b0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
b6c0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
b6d0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
b6e0: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
b6f0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
b700: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
b710: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
b720: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
b730: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
b740: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
b750: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
b760: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
b770: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
b780: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
b790: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
b7a0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
b7b0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
b7c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
b7d0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
b7e0: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
b7f0: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
b800: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
b810: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
b820: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
b830: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
b840: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
b850: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
b860: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
b870: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
b880: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
b890: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
b8a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b8b0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
b8c0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
b8d0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
b8e0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
b8f0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
b900: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
b910: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
b920: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
b930: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
b940: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
b950: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
b960: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
b970: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
b980: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
b990: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
b9a0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
b9b0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
b9c0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b9d0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
b9e0: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
b9f0: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
ba00: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
ba10: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
ba20: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
ba30: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
ba40: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
ba50: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
ba60: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
ba70: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
ba80: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
ba90: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
baa0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
bab0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
bac0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
bad0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
bae0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
baf0: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
bb00: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
bb10: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
bb20: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
bb30: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
bb40: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
bb50: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
bb60: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
bb70: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
bb80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
bb90: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
bba0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
bbb0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
bbc0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
bbd0: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
bbe0: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
bbf0: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
bc00: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
bc10: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
bc20: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
bc30: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
bc40: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
bc50: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
bc60: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
bc70: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
bc80: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
bc90: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
bca0: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
bcb0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
bcc0: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
bcd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
bce0: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
bcf0: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
bd00: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
bd10: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
bd20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
bd30: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
bd40: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
bd50: 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a  isHot){.  i64 sz
bd60: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
bd70: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
bd80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bd90: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32  n bytes */.  u32
bda0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
bdb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bdc0: 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68  of Records in th
bdd0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  e journal */.  i
bde0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
bdf0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
be00: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e  counter */.  Pgn
be10: 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20  o mxPg = 0;     
be20: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
be30: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   the original fi
be40: 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20  le in pages */. 
be50: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
be60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
be70: 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75  ult code of a su
be80: 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68  broutine */.  ch
be90: 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b  ar *zMaster = 0;
bea0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
beb0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
bec0: 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a   file if any */.
bed0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
bee0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
bef0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75  s are in the jou
bf00: 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72  rnal.  Abort ear
bf10: 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a  ly if.  ** the j
bf20: 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e  ournal is empty.
bf30: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
bf40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bf50: 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
bf60: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
bf70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a  pPager->jfd, &sz
bf80: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
bf90: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d  LITE_OK || szJ==
bfa0: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  0 ){.    goto en
bfb0: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
bfc0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
bfd0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
bfe0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
bff0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
c000: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
c010: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
c020: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
c030: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
c040: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
c050: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
c060: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
c070: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
c080: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
c090: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
c0a0: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
c0b0: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
c0c0: 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66  urnal(pPager->jf
c0d0: 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20  d, &zMaster);.  
c0e0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c0f0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
c100: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
c110: 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73  | (zMaster && !s
c120: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
c130: 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a  ts(zMaster)) ){.
c140: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
c150: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61  Master);.    zMa
c160: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66  ster = 0;.    if
c170: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
c180: 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  E ) rc = SQLITE_
c190: 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  OK;.    goto end
c1a0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
c1b0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
c1c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
c1d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c1e0: 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  lOff = 0;..  /* 
c1f0: 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  This loop termin
c200: 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65 6e  ates either when
c210: 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c   the readJournal
c220: 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72  Hdr() call retur
c230: 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  ns.  ** SQLITE_D
c240: 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  ONE or an IO err
c250: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
c260: 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20  while( 1 ){..   
c270: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
c280: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c290: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c2a0: 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
c2b0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
c2c0: 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
c2d0: 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
c2e0: 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
c2f0: 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
c300: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
c310: 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
c320: 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
c330: 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
c340: 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
c350: 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
c360: 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
c370: 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
c380: 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
c390: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
c3a0: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
c3b0: 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a   &nRec, &mxPg);.
c3c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c3d0: 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20  TE_OK ){ .      
c3e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
c3f0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ONE ){.        r
c400: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c410: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
c420: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c440: 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66 66   nRec is 0xfffff
c450: 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a  fff, then this j
c460: 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74  ournal was creat
c470: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a  ed by a process.
c480: 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69      ** working i
c490: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20  n no-sync mode. 
c4a0: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
c4b0: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
c4c0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
c4d0: 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ile consists of 
c4e0: 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72 65  pages, there are
c4f0: 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c   no more journal
c500: 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74   headers. Comput
c510: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c  e.    ** the val
c520: 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64  ue of nRec based
c530: 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74   on this assumpt
c540: 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
c550: 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66  if( nRec==0xffff
c560: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73  ffff ){.      as
c570: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
c580: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c590: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c5a0: 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   );.      nRec =
c5b0: 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f   (szJ - JOURNAL_
c5c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f  HDR_SZ(pPager))/
c5d0: 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
c5e0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
c5f0: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
c600: 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62  0 and this rollb
c610: 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e  ack is of a tran
c620: 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20  saction created 
c630: 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  by this.    ** p
c640: 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73 20  rocess. In this 
c650: 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f 66  case the rest of
c660: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c670: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20  e consists of.  
c680: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20    ** journalled 
c690: 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73 20  copies of pages 
c6a0: 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
c6b0: 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  read back into t
c6c0: 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f  he cache..    */
c6d0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
c6e0: 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20 20   && !isHot ){.  
c6f0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
c700: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
c710: 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f  lOff) / JOURNAL_
c720: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
c730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
c740: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
c750: 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
c760: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
c770: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
c780: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
c790: 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f  e back to it's o
c7a0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
c7b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
c7c0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
c7d0: 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a  R_EXCLUSIVE && .
c7e0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c7f0: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
c800: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c810: 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  r) ){.      asse
c820: 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
c830: 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61  DbSize==0 || pPa
c840: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d  ger->origDbSize=
c850: 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72  =mxPg );.      r
c860: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
c870: 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29  te(pPager, mxPg)
c880: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c8a0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
c8b0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ayback;.      }.
c8c0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
c8d0: 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20  Size = mxPg;.   
c8e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   }..    /* Copy 
c8f0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
c900: 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ut of the journa
c910: 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20  l and back into 
c920: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c930: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
c940: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
c950: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
c960: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
c970: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
c980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
c990: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
c9a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c9b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c9c0: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c9d0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
c9e0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
c9f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca00: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
ca10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ca20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ca30: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
ca40: 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
ca50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ca60: 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
ca70: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
ca80: 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
ca90: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
caa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
cab0: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
cac0: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
cad0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
cae0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
caf0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
cb00: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
cb10: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
cb20: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
cb30: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
cb40: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
cb50: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
cb60: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
cb70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cb80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
cb90: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
cba0: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
cbb0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
cbc0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
cbd0: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
cbe0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
cbf0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
cc00: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
cc10: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
cc20: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
cc30: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
cc40: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
cc50: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
cc60: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
cc70: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
cc80: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
cc90: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
cca0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
ccb0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
ccc0: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
ccd0: 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  >fd);.  return r
cce0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
ccf0: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
cd00: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
cd10: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
cd20: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
cd30: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
cd40: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
cd50: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
cd60: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
cd70: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
cd80: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
cd90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cda0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
cdb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
cdc0: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
cdd0: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
cde0: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
cdf0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
ce00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
ce10: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
ce20: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
ce30: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
ce40: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
ce50: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
ce60: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
ce70: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
ce80: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
ce90: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
cea0: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
ceb0: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
cec0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
ced0: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
cee0: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
cef0: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
cf00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
cf10: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
cf20: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
cf30: 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
cf40: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
cf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
cf60: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
cf70: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cf90: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
cfa0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
cfb0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
cfc0: 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
cfd0: 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69  DEBUG .  {.    i
cfe0: 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72  64 os_szJ;.    r
cff0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
d000: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
d010: 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20  d, &os_szJ);.   
d020: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d030: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
d040: 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d      assert( szJ=
d050: 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23  =os_szJ );.  }.#
d060: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20  endif..  /* Set 
d070: 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65  hdrOff to be the
d080: 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74   offset just aft
d090: 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
d0a0: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20  e last journal. 
d0b0: 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e   ** page written
d0c0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
d0d0: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
d0e0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d   for this statem
d0f0: 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  ent.  ** transac
d100: 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e  tion was written
d110: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
d120: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
d130: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
d140: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
d150: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
d160: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
d170: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
d180: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
d190: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
d1a0: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
d1b0: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
d1c0: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
d1d0: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
d1e0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
d1f0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
d200: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
d210: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
d220: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
d230: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
d240: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
d250: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d  ->stmtSize);.  }
d260: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d270: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
d280: 53 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61 67  SHARED );.  pPag
d290: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
d2a0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
d2b0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d2c0: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d2d0: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d2e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d2f0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d300: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d310: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d320: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d330: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d340: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d350: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d360: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d370: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d380: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d390: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d3a0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d3b0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d3c0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d3d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d3e0: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d3f0: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d400: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d410: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d420: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d430: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d440: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d450: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d460: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d470: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d480: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d490: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d4a0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d4b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d4c0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d4d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d4e0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d4f0: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d500: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d510: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d520: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d530: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d540: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d550: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d560: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d570: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d580: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d590: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d5a0: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d5b0: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d5c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d5d0: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d5e0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d5f0: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d600: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d610: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d620: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d630: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d640: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d650: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d660: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d670: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d680: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d690: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d6a0: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d6b0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d6c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d6d0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d6e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d6f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d700: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d710: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d730: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d740: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d750: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d760: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d770: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d780: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d790: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d7a0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d7b0: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d7c0: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d7d0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d7e0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d7f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d800: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d810: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d820: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d830: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d840: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d850: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d860: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d870: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d880: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d890: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d8a0: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d8b0: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d8c0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d8d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d8e0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d8f0: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d900: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d910: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d920: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d930: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d940: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d950: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d960: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d970: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d980: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d990: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d9a0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d9b0: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d9c0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d9d0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d9e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d9f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
da00: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
da10: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
da20: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
da30: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
da40: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
da50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
da60: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
da70: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
da80: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
da90: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
daa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
dab0: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
dac0: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
dad0: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
dae0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
daf0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
db00: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
db10: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
db20: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
db30: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
db40: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
db50: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
db60: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
db70: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
db80: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
db90: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
dba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
dbb0: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
dbc0: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
dbd0: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
dbe0: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
dbf0: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
dc00: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
dc10: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
dc20: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
dc30: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
dc40: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
dc50: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
dc60: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
dc70: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
dc80: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
dc90: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
dca0: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
dcb0: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
dcc0: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
dcd0: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
dce0: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
dcf0: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
dd00: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
dd10: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
dd20: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
dd30: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
dd40: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dd50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dd60: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
dd70: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
dd80: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
dd90: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
dda0: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
ddb0: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
ddc0: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
ddd0: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dde0: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
ddf0: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
de00: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
de10: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
de20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de30: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
de40: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
de50: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
de60: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
de70: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
de80: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
de90: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
dea0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
deb0: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
dec0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
ded0: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dee0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
def0: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
df00: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
df10: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
df20: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
df30: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
df40: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
df50: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
df60: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
df70: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
df80: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
df90: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
dfa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dfb0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
dfc0: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
dfd0: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
dfe0: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
dff0: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
e000: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
e010: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
e020: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
e030: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
e040: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
e050: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
e060: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
e070: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
e080: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
e090: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
e0a0: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
e0b0: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
e0c0: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
e0d0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
e0e0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
e0f0: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
e100: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
e110: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
e120: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
e130: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
e140: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
e150: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
e160: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
e170: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
e180: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
e190: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e1a0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
e1b0: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
e1c0: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
e1d0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
e1e0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e1f0: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
e200: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
e210: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
e220: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
e230: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e240: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e250: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e260: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e270: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e280: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e290: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e2a0: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e2b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e2c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e2d0: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e2e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e2f0: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e300: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e310: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e320: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e330: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e340: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e350: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e360: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e370: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e380: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e390: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e3a0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e3b0: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e3c0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e3d0: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e3e0: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e3f0: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e400: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e410: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e420: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e430: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e440: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e450: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e460: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e470: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e480: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e490: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e4a0: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e4b0: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e4c0: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e4d0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e4e0: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e4f0: 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c  pFd, 1);.  }whil
e500: 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d  e( cnt>0 && rc!=
e510: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
e520: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
e530: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e540: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
e550: 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61  new page cache a
e560: 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72  nd put a pointer
e570: 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63   to the page cac
e580: 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a  he in *ppPager..
e590: 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62  ** The file to b
e5a0: 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f  e cached need no
e5b0: 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69  t exist.  The fi
e5c0: 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  le is not locked
e5d0: 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69   until.** the fi
e5e0: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
e5f0: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e  te3PagerGet() an
e600: 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f  d is only held o
e610: 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a  pen until the.**
e620: 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
e630: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
e640: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
e650: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
e660: 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65  name is NULL the
e670: 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d  n a randomly-nam
e680: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ed temporary fil
e690: 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
e6a0: 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20  and used as the 
e6b0: 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65  file to be cache
e6c0: 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c  d.  The file wil
e6d0: 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  l be deleted.** 
e6e0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
e6f0: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
e700: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
e710: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
e720: 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72  " then all infor
e730: 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69  mation is held i
e740: 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69  n cache..** It i
e750: 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
e760: 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63  to disk.  This c
e770: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d  an be used to im
e780: 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e  plement an.** in
e790: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e7a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e7b0: 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67  PagerOpen(.  Pag
e7c0: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
e7d0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
e7e0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e7f0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
e800: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
e810: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
e820: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
e830: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
e840: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
e850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e860: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
e870: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
e880: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
e890: 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
e8a0: 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f       /* flags co
e8b0: 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66  ntrolling this f
e8c0: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
e8d0: 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20  r *pPager = 0;. 
e8e0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e8f0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
e900: 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d  nameLen;  /* Com
e910: 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20  piler is wrong. 
e920: 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69  This is always i
e930: 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72  nitialized befor
e940: 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c  e use */.  OsFil
e950: 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  e *fd;.  int rc 
e960: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e970: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
e980: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
e990: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
e9a0: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
e9b0: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
e9c0: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e9d0: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
e9e0: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
e9f0: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
ea00: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
ea10: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
ea20: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
ea30: 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65 66  ME_SIZE];.#ifdef
ea40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
ea50: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
ea60: 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
ea70: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
ea80: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
ea90: 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
eaa0: 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
eab0: 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
eac0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ead0: 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
eae0: 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
eaf0: 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
eb00: 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
eb10: 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
eb20: 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
eb30: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
eb40: 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
eb50: 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
eb60: 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20 49  oc can be set. I
eb70: 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65 20  t would be nice 
eb80: 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 74  to assert.  ** t
eb90: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
eba0: 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Alloc is non-zer
ebb0: 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69 73  o, but alas this
ebc0: 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61 73   breaks test cas
ebd0: 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e  es .  ** written
ebe0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 70   to invoke the p
ebf0: 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a 20  ager directly.. 
ec00: 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
ec10: 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
ec20: 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
ec30: 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b 0a  assert( pTsd );.
ec40: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
ec50: 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c 72  malloc() has alr
ec60: 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74 75  eady failed retu
ec70: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
ec80: 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20 2a   Before even.  *
ec90: 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 68  * testing for th
eca0: 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65 72  is, set *ppPager
ecb0: 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65 20   to NULL so the 
ecc0: 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68 65  caller knows the
ecd0: 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72 75   pager.  ** stru
ece0: 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72 20  cture was never 
ecf0: 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a 2f  allocated. .  */
ed00: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ed10: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
ed20: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
ed30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ed40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d  E_NOMEM;.  }.  m
ed50: 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69  emset(&fd, 0, si
ed60: 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f 2a  zeof(fd));..  /*
ed70: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
ed80: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
ed90: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
eda0: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
edb0: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
edc0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
edd0: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
ede0: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
edf0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
ee00: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
ee10: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
ee20: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
ee30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
ee40: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
ee50: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
ee60: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
ee70: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
ee80: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
ee90: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
eea0: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
eeb0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
eec0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
eed0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
eee0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
eef0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
ef00: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
ef10: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ef20: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
ef30: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
ef40: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
ef50: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Only);.      }. 
ef60: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ef70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ef80: 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29  gerOpentemp(&fd)
ef90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
efa0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d  empFileName(zTem
efb0: 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  p);.    zFilenam
efc0: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
efd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
efe0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
eff0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
f000: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f010: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f020: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
f030: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
f040: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
f050: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
f060: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
f070: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
f080: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
f090: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
f0a0: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
f0b0: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
f0c0: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
f0d0: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
f0e0: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
f0f0: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
f100: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
f110: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
f120: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
f130: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
f140: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
f150: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
f160: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
f170: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
f180: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
f190: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
f1a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
f1b0: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
f1c0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
f1d0: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
f1e0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
f1f0: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
f200: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
f210: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
f220: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
f230: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
f240: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
f250: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
f260: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
f270: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f280: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
f290: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
f2a0: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
f2b0: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
f2c0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f2d0: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
f2e0: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
f2f0: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
f300: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
f310: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
f320: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
f330: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
f340: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
f350: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
f360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f370: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f380: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f390: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
f3a0: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
f3b0: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
f3c0: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  M:rc);.  }..  PA
f3d0: 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20  GERTRACE3("OPEN 
f3e0: 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
f3f0: 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c  NDLEID(fd), zFul
f400: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f  lPathname);.  IO
f410: 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
f420: 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a  %s\n", pPager, z
f430: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20  FullPathname)). 
f440: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
f450: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
f460: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
f470: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
f480: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f490: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
f4a0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f4b0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
f4c0: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
f4d0: 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  ];.  strcpy(pPag
f4e0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
f4f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f500: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
f510: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
f520: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66  lPathname);..  f
f530: 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e  or(i=nameLen; i>
f540: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
f550: 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
f560: 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
f570: 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
f580: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
f590: 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61 67  0;.  strcpy(pPag
f5a0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46  er->zJournal, zF
f5b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f5c0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
f5d0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
f5e0: 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
f5f0: 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20  urnal[nameLen], 
f600: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70  "-journal");.  p
f610: 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a  Pager->fd = fd;.
f620: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75    /* pPager->jou
f630: 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  rnalOpen = 0; */
f640: 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
f650: 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e  urnal = useJourn
f660: 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20  al && !memDb;.  
f670: 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
f680: 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20  ck = noReadlock 
f690: 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f  && readOnly;.  /
f6a0: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  * pPager->stmtOp
f6b0: 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  en = 0; */.  /* 
f6c0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
f6d0: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f6e0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
f6f0: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
f700: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
f710: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
f720: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
f730: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
f740: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   /* pPager->stmt
f750: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f760: 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  * pPager->stmtJS
f770: 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ize = 0; */.  /*
f780: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
f790: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f7a0: 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30  er->nMaxPage = 0
f7b0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ; */.  pPager->m
f7c0: 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 61  xPage = 100;.  a
f7d0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e 4c  ssert( PAGER_UNL
f7e0: 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70  OCK==0 );.  /* p
f7f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
f800: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
f810: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72    /* pPager->err
f820: 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Mask = 0; */.  p
f830: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
f840: 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  = tempFile;.  pP
f850: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
f860: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
f870: 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
f880: 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
f890: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a  >needSync = 0; *
f8a0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  /.  pPager->noSy
f8b0: 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  nc = pPager->tem
f8c0: 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75  pFile || !useJou
f8d0: 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rnal;.  pPager->
f8e0: 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67  fullSync = (pPag
f8f0: 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b  er->noSync?0:1);
f900: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
f910: 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  irst = 0; */.  /
f920: 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  * pPager->pFirst
f930: 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20  Synced = 0; */. 
f940: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73   /* pPager->pLas
f950: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  t = 0; */.  pPag
f960: 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52  er->nExtra = FOR
f970: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78  CE_ALIGNMENT(nEx
f980: 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66  tra);.  assert(f
f990: 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28  d||memDb);.  if(
f9a0: 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70   !memDb ){.    p
f9b0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
f9c0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
f9d0: 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d  torSize(fd);.  }
f9e0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
f9f0: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
fa00: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
fa10: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
fa20: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
fa30: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
fa40: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fa50: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fa60: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
fa70: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
fa80: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
fa90: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
faa0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fab0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
fac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fad0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
fae0: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
faf0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
fb00: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
fb10: 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
fb20: 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
fb30: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
fb40: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
fb50: 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
fb60: 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
fb70: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
fb80: 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
fb90: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
fba0: 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
fbb0: 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
fbc0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
fbd0: 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
fbe0: 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
fbf0: 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
fc00: 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
fc10: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
fc20: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
fc30: 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
fc40: 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
fc50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
fc60: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
fc70: 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
fc80: 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65  sult sqlite3Page
fc90: 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  rClose().  .** D
fca0: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
fcb0: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
fcc0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
fcd0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
fce0: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
fcf0: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
fd00: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
fd10: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b  )(DbPage*,int)){
fd20: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
fd30: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
fd40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fd50: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
fd60: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
fd70: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
fd80: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
fd90: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
fda0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
fdb0: 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
fdc0: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
fdd0: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
fde0: 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
fdf0: 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
fe00: 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
fe10: 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
fe20: 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
fe30: 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
fe40: 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
fe50: 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
fe60: 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
fe70: 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
fe80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
fe90: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61  erSetReiniter(Pa
fea0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
feb0: 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
fec0: 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
fed0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
fee0: 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
fef0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
ff00: 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74   size.  Return t
ff10: 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66  he new size.  If
ff20: 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
ff30: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73   page.** size is
ff40: 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
ff50: 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
ff60: 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
ff70: 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64   selected.** and
ff80: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
ff90: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
ffa0: 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
ffb0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
ffc0: 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
ffd0: 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
ffe0: 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
fff0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10000 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
10010 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
10020 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
10030 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
10040 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
10050 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
10060 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  pageSize;.    pP
10070 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
10080 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  = sqlite3Realloc
10090 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  OrFree(pPager->p
100a0 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53 69  TmpSpace, pageSi
100b0 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
100c0 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
100d0 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ze;.}../*.** The
100e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f   following set o
100f0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  f routines are u
10100 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  sed to disable t
10110 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20  he simulated.** 
10120 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e  I/O error mechan
10130 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74  ism.  These rout
10140 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
10150 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64   avoid simulated
10160 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c  .** errors in pl
10170 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64 6f  aces where we do
10180 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
10190 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e  errors..**.** Un
101a0 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45  less -DSQLITE_TE
101b0 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68  ST=1 is used, th
101c0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
101d0 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61   all no-ops.** a
101e0 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63  nd generate no c
101f0 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ode..*/.#ifdef S
10200 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72  QLITE_TEST.exter
10210 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
10220 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a  _error_pending;.
10230 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
10240 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b  e3_io_error_hit;
10250 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
10260 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61  d_cnt;.void clea
10270 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  r_simulated_io_e
10280 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65  rror(){.  sqlite
10290 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d  3_io_error_hit =
102a0 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62   0;.}.void disab
102b0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
102c0 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
102d0 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69  saved_cnt = sqli
102e0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
102f0 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ding;.  sqlite3_
10300 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
10310 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e   = -1;.}.void en
10320 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10330 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a  o_errors(void){.
10340 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
10350 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76  or_pending = sav
10360 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a  ed_cnt;.}.#else.
10370 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73  # define clear_s
10380 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10390 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73  r().# define dis
103a0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
103b0 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66  o_errors().# def
103c0 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ine enable_simul
103d0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
103e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
103f0 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20  ead the first N 
10400 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62  bytes from the b
10410 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
10420 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  file into memory
10430 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70  .** that pDest p
10440 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a  oints to. .**.**
10450 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
10460 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20  ng is done. The 
10470 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69  rational for thi
10480 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  s is that this f
10490 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20  unction .** may 
104a0 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69  be called even i
104b0 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
104c0 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e  not exist or con
104d0 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49  tain a header. I
104e0 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65  n .** these case
104f0 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  s sqlite3OsRead(
10500 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e  ) will return an
10510 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68   error, to which
10520 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a   the correct .**
10530 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20   response is to 
10540 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20  zero the memory 
10550 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e  at pDest and con
10560 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49  tinue.  A real I
10570 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c  O error .** will
10580 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75   presumably recu
10590 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20  r and be picked 
105a0 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20  up later (Todo: 
105b0 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
105c0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
105d0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
105e0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
105f0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
10600 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
10610 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10620 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
10630 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
10640 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b   if( MEMDB==0 ){
10650 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
10660 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
10670 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  ();.    sqlite3O
10680 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
10690 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65  , 0);.    enable
106a0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
106b0 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52  rors();.    IOTR
106c0 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30  ACE(("DBHDR %p 0
106d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
106e0 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  N)).    rc = sql
106f0 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
10700 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
10710 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10720 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
10730 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
10740 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10750 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
10760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
10770 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
10780 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
10790 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
107a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
107b0 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a  .** pPager. .**.
107c0 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e  ** If the PENDIN
107d0 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74  G_BYTE lies on t
107e0 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79  he page directly
107f0 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
10800 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74  f the.** file, t
10810 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69  hen consider thi
10820 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74  s page part of t
10830 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72  he file too. For
10840 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
10850 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20  PENDING_BYTE is 
10860 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66  byte 4096 (the f
10870 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67  irst byte of pag
10880 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a  e 5) and the siz
10890 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
108a0 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20   is 4096 bytes, 
108b0 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e  5 is returned in
108c0 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69  stead of 4..*/.i
108d0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  nt sqlite3PagerP
108e0 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
108f0 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
10900 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
10910 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
10920 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
10930 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
10940 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
10950 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
10960 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d  ze>=0 ){.    n =
10970 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
10980 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10990 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
109a0 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
109b0 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51  er->fd, &n))!=SQ
109c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
109d0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
109e0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
109f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
10a00 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e      if( n>0 && n
10a10 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  <pPager->pageSiz
10a20 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31  e ){.      n = 1
10a30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10a40 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e     n /= pPager->
10a50 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  pageSize;.    }.
10a60 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
10a70 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
10a80 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
10a90 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
10aa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
10ab0 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54   n==(PENDING_BYT
10ac0 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
10ad0 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ze) ){.    n++;.
10ae0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
10af0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
10b00 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10b10 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
10b20 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
10b30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10b40 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
10b50 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
10b60 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
10b70 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
10b80 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
10b90 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
10ba0 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
10bb0 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
10bc0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
10bd0 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
10be0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
10bf0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
10c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
10c10 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
10c20 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
10c30 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
10c40 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
10c50 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
10c60 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
10c70 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
10c80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
10c90 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
10ca0 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
10cb0 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
10cc0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
10cd0 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
10ce0 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
10cf0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
10d00 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
10d10 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
10d20 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
10d30 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
10d40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10d50 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
10d60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
10d70 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
10d80 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
10d90 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10da0 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
10db0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
10dc0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
10dd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10de0 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10df0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10e00 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10e10 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10e20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10e30 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10e40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10e50 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
10e60 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10e70 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
10e80 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
10e90 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10ea0 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
10eb0 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
10ec0 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
10ed0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
10ee0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
10ef0 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
10f00 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10f10 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
10f20 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
10f30 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
10f40 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
10f50 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
10f60 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
10f70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
10f80 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
10f90 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
10fa0 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
10fb0 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
10fc0 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
10fd0 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
10fe0 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
10ff0 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
11000 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
11010 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
11020 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11030 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
11040 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
11050 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
11060 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
11070 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
11080 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
11090 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
110a0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
110b0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
110c0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
110d0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
110e0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
110f0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
11100 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
11110 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
11120 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
11130 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
11140 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
11150 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11160 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
11170 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
11180 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
111a0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
111b0 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
111c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
111d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
111e0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
111f0 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
11200 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
11210 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11220 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
11230 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11240 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
11250 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
11260 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
11270 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
11280 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
11290 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
112a0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
112b0 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
112c0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
112d0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
112e0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
112f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11300 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
11310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11320 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
11330 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
11340 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
11350 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
11360 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
11370 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
11380 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
11390 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
113a0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
113b0 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
113c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
113d0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
113e0 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
113f0 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11400 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11410 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
11420 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
11430 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11440 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
11450 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
11460 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
11470 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
11480 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
11490 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
114a0 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
114b0 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
114c0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
114d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
114e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
114f0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
11500 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
11510 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11520 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11530 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
11540 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11550 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
11560 70 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65  pPg);.      make
11570 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
11580 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
11590 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
115a0 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
115b0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66    }.}.#else.#def
115c0 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  ine memoryTrunca
115d0 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  te(p).#endif../*
115e0 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
115f0 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
11600 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
11610 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
11620 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
11630 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
11640 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
11650 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
11660 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
11670 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
11680 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
11690 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
116a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
116b0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
116c0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
116d0 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
116e0 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
116f0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
11700 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
11710 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
11720 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
11730 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
11740 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
11750 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
11760 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
11770 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
11780 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
11790 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
117a0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
117b0 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
117c0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
117d0 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
117e0 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
117f0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
11800 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
11810 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
11820 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
11830 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
11840 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
11850 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11860 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
11870 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
11880 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
11890 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
118a0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
118b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
118c0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
118d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
118e0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
118f0 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
11900 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
11910 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
11920 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11930 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
11940 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
11950 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11970 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
11980 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
11990 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
119a0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
119b0 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
119c0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
119d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
119e0 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
119f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
11a00 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
11a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
11a20 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
11a30 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
11a40 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
11a50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11a60 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
11a70 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
11a80 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
11a90 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
11aa0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
11ab0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
11ac0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
11ad0 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
11ae0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
11af0 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
11b00 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
11b10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11b30 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
11b40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
11b50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d  = nPage;.    mem
11b60 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
11b70 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
11b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
11b90 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
11ba0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  l(pPager);.  if(
11bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11bc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
11bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61  .  }..  /* Get a
11be0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11bf0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
11c00 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
11c10 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ng. */.  rc = pa
11c20 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11c30 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11c40 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11c50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11c60 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11c70 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65    }..  rc = page
11c80 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
11c90 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  r, nPage);.  if(
11ca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11cb0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
11cc0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11cd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11ce0 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  ../*.** Shutdown
11cf0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
11d00 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72    Free all memor
11d10 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20  y and close all 
11d20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  files..**.** If 
11d30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  a transaction wa
11d40 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68  s in progress wh
11d50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
11d60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a  is called, that.
11d70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11d80 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  s rolled back.  
11d90 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  All outstanding 
11da0 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
11db0 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  dated.** and the
11dc0 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65  ir memory is fre
11dd0 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  ed.  Any attempt
11de0 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20 61   to use a page a
11df0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
11e00 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63 68  h this page cach
11e10 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  e after this fun
11e20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69  ction returns wi
11e30 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
11e40 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
11e50 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
11e60 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75  nction always su
11e70 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72 61  cceeds. If a tra
11e80 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
11e90 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a  ve an attempt.**
11ea0 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c   is made to roll
11eb0 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20   it back. If an 
11ec0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
11ed0 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
11ee0 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e   .** a hot journ
11ef0 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69  al may be left i
11f00 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
11f10 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73   but no error is
11f20 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20   returned.** to 
11f30 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69  the caller..*/.i
11f40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
11f50 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
11f60 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  er){.#ifdef SQLI
11f70 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
11f80 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a  _MANAGEMENT.  /*
11f90 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e   A malloc() cann
11fa0 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74  ot fail in sqlit
11fb0 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20 61  e3ThreadData() a
11fc0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61  s one or more ca
11fd0 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c  lls to .  ** mal
11fe0 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65 20  loc() must have 
11ff0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64  already been mad
12000 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61 64  e by this thread
12010 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a   before it gets.
12020 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69    ** to this poi
12030 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  nt. This means t
12040 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d 75  he ThreadData mu
12050 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c  st have been all
12060 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20  ocated already. 
12070 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65   ** so that Thre
12080 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61  adData.nAlloc ca
12090 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  n be set..  */. 
120a0 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54 73   ThreadData *pTs
120b0 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61  d = sqlite3Threa
120c0 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72  dData();.  asser
120d0 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61  t( pPager );.  a
120e0 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20 70  ssert( pTsd && p
120f0 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23  Tsd->nAlloc );.#
12100 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65  endif..  disable
12110 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12120 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72  rors();.  pPager
12130 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
12140 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
12150 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61  veMode = 0;.  pa
12160 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
12170 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  );.  pagerUnlock
12180 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
12190 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69  er);.  enable_si
121a0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
121b0 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  s();.  PAGERTRAC
121c0 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
121d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
121e0 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43  );.  IOTRACE(("C
121f0 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOSE %p\n", pPag
12200 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20 70  er)).  assert( p
12210 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c  Pager->errCode |
12220 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | (pPager->journ
12230 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61  alOpen==0 && pPa
12240 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30  ger->stmtOpen==0
12250 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
12260 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
12270 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
12280 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
12290 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
122a0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
122b0 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
122c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
122d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
122e0 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
122f0 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  stfd);.  }.  sql
12300 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
12310 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54  ger->fd);.  /* T
12320 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
12330 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
12340 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
12350 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
12360 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
12370 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
12380 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
12390 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
123a0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
123b0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
123c0 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  ANAGEMENT.  /* R
123d0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72 20  emove the pager 
123e0 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20  from the linked 
123f0 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 73  list of pagers s
12400 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a  tarting at .  **
12410 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61 67   ThreadData.pPag
12420 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  er if memory-man
12430 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
12440 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
12450 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61  Pager==pTsd->pPa
12460 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d  ger ){.    pTsd-
12470 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
12480 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
12490 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d  {.    Pager *pTm
124a0 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20  p;.    for(pTmp 
124b0 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20  = pTsd->pPager; 
124c0 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61  pTmp->pNext!=pPa
124d0 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  ger; pTmp=pTmp->
124e0 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d  pNext){}.    pTm
124f0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  p->pNext = pPage
12500 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65  r->pNext;.  }.#e
12510 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65  ndif.  sqliteFre
12520 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  e(pPager->aHash)
12530 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
12540 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
12550 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12560 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
12570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12580 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12590 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
125a0 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
125b0 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
125c0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
125d0 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
125e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
125f0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
12600 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
12610 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
12620 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
12630 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
12640 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
12650 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
12660 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
12670 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12680 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
12690 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
126a0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
126b0 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
126c0 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
126d0 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
126e0 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
126f0 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
12700 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
12710 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
12720 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
12730 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
12740 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
12750 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
12760 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
12770 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
12780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12790 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
127a0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
127b0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
127c0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
127d0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
127e0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
127f0 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ove it. */.    i
12800 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61  f( pPg==pPg->pPa
12810 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12820 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  d ){.      PgHdr
12830 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74   *p = pPg->pNext
12840 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c  Free;.      whil
12850 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
12860 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
12870 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20  extFree; }.     
12880 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12890 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a  irstSynced = p;.
128a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
128b0 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
128c0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
128d0 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
128e0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
128f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12900 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12910 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
12920 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20  extFree;.    }. 
12930 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
12940 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  tFree ){.      p
12950 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70  Pg->pNextFree->p
12960 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e  PrevFree = pPg->
12970 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
12980 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12990 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d  >pPager->pLast =
129a0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
129b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
129c0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a  pPager->nRef++;.
129d0 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b    }.  pPg->nRef+
129e0 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67  +;.  REFINFO(pPg
129f0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
12a00 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69  TE_DEBUG.  stati
12a10 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28  c void page_ref(
12a20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20  PgHdr *pPg){.   
12a30 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
12a40 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65  0 ){.      _page
12a50 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d  _ref(pPg);.    }
12a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
12a70 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52  >nRef++;.      R
12a80 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
12a90 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64   }.  }.#else.# d
12aa0 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50  efine page_ref(P
12ab0 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d  )   ((P)->nRef==
12ac0 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28  0?_page_ref(P):(
12ad0 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b  void)(P)->nRef++
12ae0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12af0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Increment the re
12b00 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
12b10 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 69  r a page.  The i
12b20 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a  nput pointer is.
12b30 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ** a reference t
12b40 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  o the page data.
12b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
12b60 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
12b70 70 50 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66  pPg){.  page_ref
12b80 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
12b90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12ba0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
12bb0 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
12bc0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
12bd0 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
12be0 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
12bf0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12c00 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
12c10 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
12c20 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
12c30 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
12c40 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
12c50 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
12c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
12c70 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
12c80 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
12c90 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
12ca0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
12cb0 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
12cc0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
12cd0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
12ce0 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
12cf0 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
12d00 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
12d10 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
12d20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
12d30 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
12d40 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
12d50 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
12d60 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
12d70 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
12d80 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
12d90 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
12da0 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
12db0 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
12dc0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
12dd0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
12de0 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
12df0 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
12e00 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
12e10 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
12e20 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
12e30 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
12e40 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
12e50 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
12e60 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
12e70 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
12e80 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
12e90 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
12ea0 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
12eb0 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
12ec0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
12ed0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
12ee0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
12ef0 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
12f00 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
12f10 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
12f20 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
12f30 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
12f40 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
12f50 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
12f60 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
12f70 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
12f80 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
12f90 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
12fa0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
12fb0 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
12fc0 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
12fd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
12fe0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
12ff0 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
13000 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13010 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
13020 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
13030 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
13040 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
13050 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
13060 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
13070 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
13080 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
13090 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
130a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
130b0 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
130c0 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
130d0 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
130e0 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
130f0 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
13100 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
13110 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
13120 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
13130 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
13140 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
13150 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
13160 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
13170 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
13180 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
13190 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
131a0 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
131b0 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
131c0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
131d0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
131e0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
131f0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
13200 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
13210 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
13220 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
13230 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  jSz);.        if
13240 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
13250 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73   rc;.        ass
13260 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13270 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a  rnalOff==jSz );.
13280 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13290 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
132a0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65 63  * Write the nRec
132b0 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20   value into the 
132c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61  journal file hea
132d0 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20  der. If in.     
132e0 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68     ** full-synch
132f0 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e  ronous mode, syn
13300 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
13310 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65  rst. This ensure
13320 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  s that.        *
13330 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72  * all data has r
13340 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69  eally hit the di
13350 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69  sk before nRec i
13360 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72  s updated to mar
13370 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  k.        ** it 
13380 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  as a candidate f
13390 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20  or rollback. .  
133a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
133b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
133c0 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
133d0 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
133e0 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
133f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13400 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20  Pager));.       
13410 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59     IOTRACE(("JSY
13420 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
13430 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  )).          rc 
13440 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
13450 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
13460 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
13470 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13480 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
134a0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
134b0 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
134c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
134d0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
134e0 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
134f0 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20  nalMagic));.    
13500 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13510 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
13520 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
13530 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
13540 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
13550 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13560 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
13570 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
13580 63 29 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20  c), 4)).        
13590 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
135a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
135b0 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
135c0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
135d0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
135e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
135f0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
13600 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
13610 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
13620 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
13630 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
13640 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
13650 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
13660 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13670 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
13680 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c  RACE(("JSYNC %d\
13690 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
136a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
136b0 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66  sSync(pPager->jf
136c0 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  d, pPager->full_
136d0 66 73 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  fsync);.      if
136e0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
136f0 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65   rc;.      pPage
13700 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
13710 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 1;.    }.   
13720 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13730 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45  c = 0;..    /* E
13740 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e  rase the needSyn
13750 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72  c flag from ever
13760 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  y page..    */. 
13770 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
13780 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
13790 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
137a0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
137b0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
137c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
137d0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
137e0 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
137f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
13800 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65    /* If the Page
13810 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
13820 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68  is clear then th
13830 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
13840 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20  .  ** flag must 
13850 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f  also be clear fo
13860 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65  r all pages.  Ve
13870 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20  rify that this. 
13880 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73   ** invariant is
13890 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c   true..  */.  el
138a0 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  se{.    for(pPg=
138b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
138c0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
138d0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
138e0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
138f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
13900 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13910 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
13920 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  =pPager->pFirst 
13930 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
13940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13950 2a 0a 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c  *.** Merge two l
13960 69 73 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f  ists of pages co
13970 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
13980 79 20 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72  y and in pgno or
13990 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62  der..** Do not b
139a0 6f 74 68 20 66 69 78 69 6e 67 20 74 68 65 20 70  oth fixing the p
139b0 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
139c0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  rs..*/.static Pg
139d0 48 64 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c  Hdr *merge_pagel
139e0 69 73 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50  ist(PgHdr *pA, P
139f0 67 48 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48  gHdr *pB){.  PgH
13a00 64 72 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69  dr result, *pTai
13a10 6c 3b 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65  l;.  pTail = &re
13a20 73 75 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  sult;.  while( p
13a30 41 20 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69  A && pB ){.    i
13a40 66 28 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e  f( pA->pgno<pB->
13a50 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54  pgno ){.      pT
13a60 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
13a70 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20  ;.      pTail = 
13a80 70 41 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70  pA;.      pA = p
13a90 41 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  A->pDirty;.    }
13aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69  else{.      pTai
13ab0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a  l->pDirty = pB;.
13ac0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42        pTail = pB
13ad0 3b 0a 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d  ;.      pB = pB-
13ae0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
13af0 20 7d 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20   }.  if( pA ){. 
13b00 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13b10 20 3d 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69   = pA;.  }else i
13b20 66 28 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61  f( pB ){.    pTa
13b30 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b  il->pDirty = pB;
13b40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
13b50 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ail->pDirty = 0;
13b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
13b70 73 75 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a  sult.pDirty;.}..
13b80 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c  /*.** Sort the l
13b90 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
13ba0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  accending order 
13bb0 62 79 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20  by pgno.  Pages 
13bc0 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64  are.** connected
13bd0 20 62 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74   by pDirty point
13be0 65 72 73 2e 20 20 54 68 65 20 70 50 72 65 76 44  ers.  The pPrevD
13bf0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72  irty pointers ar
13c00 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62  e.** corrupted b
13c10 79 20 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a  y this sort..*/.
13c20 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42  #define N_SORT_B
13c30 55 43 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20  UCKET 25.static 
13c40 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
13c50 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
13c60 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
13c70 4f 52 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b  ORT_BUCKET], *p;
13c80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73  .  int i;.  mems
13c90 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(a, 0, sizeof(
13ca0 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49  a));.  while( pI
13cb0 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e  n ){.    p = pIn
13cc0 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70  ;.    pIn = p->p
13cd0 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44  Dirty;.    p->pD
13ce0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f  irty = 0;.    fo
13cf0 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f  r(i=0; i<N_SORT_
13d00 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a  BUCKET-1; i++){.
13d10 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d        if( a[i]==
13d20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69  0 ){.        a[i
13d30 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62  ] = p;.        b
13d40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
13d50 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d  e{.        p = m
13d60 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
13d70 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  i], p);.        
13d80 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  a[i] = 0;.      
13d90 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13da0 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  i==N_SORT_BUCKET
13db0 2d 31 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d  -1 ){.      a[i]
13dc0 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
13dd0 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
13de0 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d  }.  }.  p = a[0]
13df0 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  ;.  for(i=1; i<N
13e00 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b  _SORT_BUCKET; i+
13e10 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67  +){.    p = merg
13e20 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b  e_pagelist(p, a[
13e30 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
13e40 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
13e50 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
13e60 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
13e70 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
13e80 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
13e90 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
13ea0 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
13eb0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
13ec0 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
13ed0 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
13ee0 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
13ef0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
13f00 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13f10 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
13f20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
13f30 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
13f40 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13f50 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
13f60 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
13f70 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
13f80 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
13f90 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
13fa0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
13fb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
13fc0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
13fd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
13fe0 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
13ff0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
14000 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
14010 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
14020 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
14030 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
14040 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
14050 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
14060 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
14070 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
14080 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
14090 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
140a0 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
140b0 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
140c0 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
140d0 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
140e0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
140f0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
14100 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
14110 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
14120 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
14130 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
14140 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
14150 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
14160 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
14170 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
14180 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
14190 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
141a0 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
141b0 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
141c0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
141d0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
141e0 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
141f0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
14200 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
14210 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
14220 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
14230 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
14240 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14250 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
14260 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
14270 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
14280 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
14290 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
142a0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
142b0 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
142c0 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
142d0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
142e0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
142f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
14300 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
14310 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
14320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14330 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14340 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72  }..  pList = sor
14350 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74  t_pagelist(pList
14360 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
14370 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
14380 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
14390 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
143a0 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
143b0 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
143c0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
143d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
143e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
143f0 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
14400 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
14410 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
14420 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
14430 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
14440 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
14450 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
14460 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
14470 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
14480 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
14490 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
144a0 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
144b0 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
144c0 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
144d0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
144e0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
144f0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
14500 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
14510 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
14520 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ize ){.      cha
14530 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
14540 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  2(pPager, PGHDR_
14550 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
14560 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
14570 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
14580 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E3("STORE %d pag
14590 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
145a0 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
145b0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f  >pgno);.      IO
145c0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
145d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
145e0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20  pList->pgno)).  
145f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14600 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
14610 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  fd, pData, pPage
14620 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14630 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
14640 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
14650 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
14660 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
14670 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14680 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
14690 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
146a0 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
146b0 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
146c0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
146d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
146e0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
146f0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14700 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
14710 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
14720 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
14730 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
14740 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
14750 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
14760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14770 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
14780 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
14790 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
147a0 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
147b0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
147c0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
147d0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
147e0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
147f0 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
14800 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
14810 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
14820 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
14830 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
14840 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
14850 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
14860 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
14870 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
14880 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
14890 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
148a0 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
148b0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
148c0 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
148d0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
148e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
148f0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14900 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14910 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
14920 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
14930 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
14940 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
14950 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
14960 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
14970 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
14980 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
14990 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
149a0 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
149b0 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
149c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
149d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
149e0 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
149f0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
14a00 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
14a10 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
14a20 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  l) ) return 0;. 
14a30 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68   if( sqlite3OsCh
14a40 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14a50 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
14a60 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
14a70 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
14a80 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29  unt(pPager)==0 )
14a90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44  {.    sqlite3OsD
14aa0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
14ab0 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74  ournal);.    ret
14ac0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
14ad0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
14ae0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  }.}../*.** Try t
14af0 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
14b00 20 74 68 65 20 63 61 63 68 65 20 74 68 61 74 20   the cache that 
14b10 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e  can be recycled.
14b20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
14b30 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20  tine may return 
14b40 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
14b50 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c  LITE_FULL or SQL
14b60 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64  ITE_OK. It .** d
14b70 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20  oes not set the 
14b80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
14b90 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
14ba0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65  tic int pager_re
14bb0 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61  cycle(Pager *pPa
14bc0 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c  ger, int syncOk,
14bd0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
14be0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
14bf0 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  *ppPg = 0;..  /*
14c00 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
14c10 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
14c20 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
14c30 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  hat does not.  *
14c40 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20  * require us to 
14c50 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e  do an fsync() on
14c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20   the journal..  
14c70 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65  */.  pPg = pPage
14c80 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
14c90 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75  ..  /* If we cou
14ca0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
14cb0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
14cc0 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
14cd0 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  c().  ** on the 
14ce0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
14cf0 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72  n fsync the jour
14d00 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20  nal file.  This 
14d10 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73  is a.  ** very s
14d20 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73  low operation, s
14d30 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74  o we work hard t
14d40 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74  o avoid it.  But
14d50 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20   sometimes.  ** 
14d60 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
14d70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
14d80 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  Pg==0 && pPager-
14d90 3e 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f  >pFirst && syncO
14da0 6b 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20  k && !MEMDB){.  
14db0 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a    int rc = syncJ
14dc0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
14dd0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
14de0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
14df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
14e00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14e10 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
14e20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
14e30 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
14e40 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
14e50 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
14e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
14e70 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
14e80 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69  oid ever modifyi
14e90 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ng a journal.   
14ea0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61     ** header tha
14eb0 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  t is involved in
14ec0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66   the rollback of
14ed0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
14ee0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
14ef0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
14f00 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
14f10 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
14f20 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  er is.      ** t
14f30 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
14f40 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
14f50 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f  dated)..      */
14f60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
14f70 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  Rec = 0;.      a
14f80 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
14f90 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
14fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14fb0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
14fc0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
14fd0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
14fe0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
14ff0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
15000 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15010 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15020 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
15030 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69  >pFirst;.  }.  i
15040 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
15050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15060 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
15070 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
15080 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
15090 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
150a0 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
150b0 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f  t is dirty..  */
150c0 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
150d0 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  y ){.    int rc;
150e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
150f0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
15100 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
15110 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  Pg);.    pPg->di
15120 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
15130 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
15140 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
15150 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
15160 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
15170 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15180 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15190 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
151a0 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20  ( pPg->dirty==0 
151b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
151c0 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
151d0 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
151e0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
151f0 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74  k, then.  ** set
15200 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
15210 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
15220 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
15230 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
15240 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
15250 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
15260 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
15270 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
15280 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
15290 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
152a0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
152b0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
152c0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
152d0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
152e0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
152f0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
15300 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
15310 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
15320 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
15330 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
15340 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
15350 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
15360 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
15370 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
15380 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
15390 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
153a0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
153b0 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
153c0 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
153d0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
153e0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
153f0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
15400 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
15410 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
15420 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
15430 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
15440 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
15450 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49  e(pPg);.  TEST_I
15460 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66  NCR(pPager->nOvf
15470 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70  l);..  *ppPg = p
15480 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
15490 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
154a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
154b0 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65  s called to free
154c0 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e   superfluous dyn
154d0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
154e0 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c  ed memory.** hel
154f0 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20 73  d by the pager s
15500 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e  ystem. Memory in
15510 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69   use by any SQLi
15520 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74  te pager allocat
15530 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72  ed.** by the cur
15540 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20  rent thread may 
15550 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29 65  be sqliteFree()e
15560 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73  d..**.** nReq is
15570 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
15580 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
15590 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68  equired. Once th
155a0 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62  is much has.** b
155b0 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68  een released, th
155c0 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
155d0 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76  ns. A negative v
155e0 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65  alue for nReq me
155f0 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d  ans.** free as m
15600 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
15610 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75  ssible. The retu
15620 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
15630 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a  total number .**
15640 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d   of bytes of mem
15650 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f  ory released..*/
15660 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
15670 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
15680 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69  AGEMENT.int sqli
15690 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d  te3PagerReleaseM
156a0 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b  emory(int nReq){
156b0 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44  .  const ThreadD
156c0 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71  ata *pTsdro = sq
156d0 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52  lite3ThreadDataR
156e0 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67  eadOnly();.  Pag
156f0 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65  er *p;.  int nRe
15700 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e  leased = 0;.  in
15710 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t i;..  /* If th
15720 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  e the global mut
15730 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73  ex is held, this
15740 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f   subroutine beco
15750 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b  mes a.  ** o-op;
15760 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d   zero bytes of m
15770 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e  emory are freed.
15780 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73    This is becaus
15790 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74  e.  ** some of t
157a0 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20  he code invoked 
157b0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
157c0 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74   may also.  ** t
157d0 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ry to obtain the
157e0 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e   mutex, resultin
157f0 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e  g in a deadlock.
15800 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  .  */.  if( sqli
15810 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20  te3OsInMutex(0) 
15820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
15830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72  .  }..  /* Outer
15840 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66  most loop runs f
15850 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69  or at most two i
15860 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74  terations. First
15870 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20   iteration we.  
15880 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d  ** try to find m
15890 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62  emory that can b
158a0 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f  e released witho
158b0 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63  ut calling fsync
158c0 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20  (). Second.  ** 
158d0 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68  iteration (which
158e0 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68   only runs if th
158f0 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74  e first failed t
15900 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65  o free nReq byte
15910 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  s of.  ** memory
15920 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  ) is permitted t
15930 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20  o call fsync(). 
15940 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73  This is of cours
15950 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a  e much more .  *
15960 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a  * expensive..  *
15970 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  /.  for(i=0; i<=
15980 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a  1; i++){..    /*
15990 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
159a0 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61 67  l the SQLite pag
159b0 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ers opened by th
159c0 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
159d0 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70  . */.    for(p=p
159e0 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70  Tsdro->pPager; p
159f0 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e   && (nReq<0 || n
15a00 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20  Released<nReq); 
15a10 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
15a20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
15a30 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
15a40 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20      /* For each 
15a50 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72  pager, try to fr
15a60 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73  ee as many pages
15a70 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69   as possible (wi
15a80 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20  thout .      ** 
15a90 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20  calling fsync() 
15aa0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
15ab0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
15ac0 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
15ad0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e  .      ** loop).
15ae0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15af0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b  while( SQLITE_OK
15b00 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65  ==(rc = pager_re
15b10 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67  cycle(p, i, &pPg
15b20 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20  )) && pPg) {.   
15b30 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f       /* We've fo
15b40 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66 72  und a page to fr
15b50 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  ee. At this poin
15b60 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20 62  t the page has b
15b70 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  een .        ** 
15b80 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
15b90 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65   page hash-table
15ba0 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  , free-list and 
15bb0 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20  synced-list .   
15bc0 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53       ** (pFirstS
15bd0 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74  ynced). It is st
15be0 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70  ill in the all p
15bf0 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74  ages (pAll) list
15c00 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65  . .        ** Re
15c10 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69  move it from thi
15c20 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72  s list before fr
15c30 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a  eeing..        *
15c40 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64  *.        ** Tod
15c50 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61 67  o: Check the Pag
15c60 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f  er.pStmt list to
15c70 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
15c80 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20  is Ok. It .     
15c90 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
15ca0 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
15cb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48    */.        PgH
15cc0 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20  dr *pTmp;.      
15cd0 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b    assert( pPg );
15ce0 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 72 65  .        page_re
15cf0 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
15d00 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
15d10 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41    if( pPg==p->pA
15d20 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
15d30 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e   p->pAll = pPg->
15d40 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
15d50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15d60 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e     for( pTmp=p->
15d70 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
15d80 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
15d90 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
15da0 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
15db0 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
15dc0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
15dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
15de0 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69  Released += sqli
15df0 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29  teAllocSize(pPg)
15e00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15e10 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
15e20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63   }..      if( rc
15e30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15e40 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72         /* An err
15e50 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73  or occured whils
15e60 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  t writing to the
15e70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
15e80 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  r .        ** jo
15e90 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72  urnal in pager_r
15ea0 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72  ecycle(). The er
15eb0 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72  ror is not retur
15ec0 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20  ned to the .    
15ed0 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66      ** caller of
15ee0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
15ef0 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65  Instead, set the
15f00 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76   Pager.errCode v
15f10 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20  ariable..       
15f20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
15f30 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
15f40 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
15f50 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
15f60 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  e .        ** of
15f70 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
15f80 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
15f90 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
15fa0 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
15fb0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15fc0 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 26      assert( (rc&
15fd0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f  0xff)==SQLITE_IO
15fe0 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ERR || rc==SQLIT
15ff0 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20  E_FULL );.      
16000 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61    assert( p->sta
16010 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
16020 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61  ED );.        pa
16030 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29  ger_error(p, rc)
16040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16050 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52    }..  return nR
16060 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
16070 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
16080 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
16090 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  MENT */../*.** T
160a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
160b0 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
160c0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
160d0 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
160e0 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
160f0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
16100 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
16110 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
16120 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
16130 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
16140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
16150 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
16160 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c  int pagerSharedL
16170 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
16180 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
16190 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
161a0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
161b0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
161c0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
161d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
161e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
161f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  );.      if( !pP
16200 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b  ager->noReadlock
16210 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
16220 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
16230 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
16240 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
16250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16270 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
16280 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16290 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
162a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
162b0 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
162c0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d  _LOCK );.      }
162d0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  .  .      /* If 
162e0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
162f0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
16300 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
16310 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
16320 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
16330 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68  le, then it eith
16340 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  er needs to be p
16350 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65  layed back or de
16360 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  leted..      */.
16370 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74        if( hasHot
16380 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20  Journal(pPager) 
16390 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
163a0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
163b0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
163c0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
163d0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
163e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
163f0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
16400 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
16410 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
16420 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
16430 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
16440 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
16450 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
16460 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
16470 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
16480 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
16490 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
164a0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
164b0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
164c0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
164d0 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
164e0 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
164f0 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
16500 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
16510 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
16520 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
16530 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
16540 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
16550 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
16560 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
16570 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
16580 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
16590 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
165a0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
165b0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
165c0 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45  btain it's own E
165d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
165e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
165f0 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
16600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16610 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
16620 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
16630 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
16640 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
16660 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
16670 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
16680 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
16690 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
166a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
166b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
166c0 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
166d0 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  . .        /* Op
166e0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
166f0 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e  or reading only.
16700 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
16710 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20  BUSY if.        
16720 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65  ** we are unable
16730 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
16740 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20  rnal file. .    
16750 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
16760 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
16770 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
16780 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
16790 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
167a0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
167b0 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
167c0 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
167d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
167e0 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  olds.        ** 
167f0 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f  a write lock, so
16800 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
16810 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77  any chance of tw
16820 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20  o or more.      
16830 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f    ** processes o
16840 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  pening the journ
16850 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  al at the same t
16860 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ime..        **.
16870 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75  .** Open the jou
16880 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72  rnal for read/wr
16890 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73  ite access. This
168a0 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a   is because in .
168b0 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63  .** exclusive-ac
168c0 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
168d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
168e0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
168f0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  and.        ** p
16900 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72  ossibly used for
16910 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c   a transaction l
16920 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65  ater on. On some
16930 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20   systems, the.  
16940 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63        ** OsTrunc
16950 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20  ate() call used 
16960 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
16970 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65  ess mode also re
16980 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a  quires.        *
16990 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66  * a read/write f
169a0 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ile handle..    
169b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
169c0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
169d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
169e0 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
169f0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
16a00 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
16a10 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20  int ro;.        
16a20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
16a30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20  r->tempFile );. 
16a40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
16a50 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
16a60 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rite(pPager->zJo
16a70 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
16a80 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20  jfd, &ro);.     
16a90 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a 20       if( ro ){. 
16aa0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16ab0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16ad0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
16ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16af0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
16b00 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
16b10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16b20 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16b40 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16b50 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
16b60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16b70 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
16b80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
16b90 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
16ba0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
16bb0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
16bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16bd0 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20  nalHdr = 0;. .  
16be0 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
16bf0 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
16c00 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
16c10 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
16c20 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f  te.        ** lo
16c30 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65  ck and reacquire
16c40 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
16c50 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
16c60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
16c70 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
16c80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
16c90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16ca0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16cb0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
16cc0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
16cd0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
16ce0 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  rt(pPager->state
16cf0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  ==PAGER_SHARED |
16d00 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  | .            (
16d10 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
16d20 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  eMode && pPager-
16d30 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41  >state>PAGER_SHA
16d40 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  RED).        );.
16d50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
16d60 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  f( pPager->pAll 
16d70 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  ){.        PgHdr
16d80 20 2a 70 50 61 67 65 31 20 3d 20 70 61 67 65 72   *pPage1 = pager
16d90 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16da0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16db0 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20  pPage1 ){.      
16dc0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
16dd0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67  ain(pPager, pPag
16de0 65 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  e1);.        }..
16df0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16e00 21 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50  !pager_lookup(pP
16e10 61 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20  ager, 1) );.    
16e20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16e30 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61  PagerAcquire(pPa
16e40 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  ger, 1, &pPage1,
16e50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16e70 7b 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e  {..  /* The chan
16e80 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74  ge-counter is st
16e90 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32  ored at offset 2
16ea0 34 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20  4. See also.    
16eb0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69        ** pager_i
16ec0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
16ed0 72 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  r()..          *
16ee0 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  /.          u32 
16ef0 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72  iChangeCount = r
16f00 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
16f10 61 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20  age1, 24);.     
16f20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
16f30 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f++;.          s
16f40 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
16f50 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
16f60 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16f70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  --;.          if
16f80 28 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d  ( iChangeCount!=
16f90 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
16fa0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
16fb0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
16fc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16fd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
16fe0 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
16ff0 75 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75  unt = iChangeCou
17000 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
17010 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17020 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17030 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
17040 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d   pPager->state<=
17050 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
17060 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17070 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17080 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
17090 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
170a0 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
170b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
170c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
170d0 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
170e0 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
170f0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
17100 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
17110 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
17120 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
17130 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
17140 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
17150 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
17160 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
17170 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
17180 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
17190 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
171a0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
171b0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
171c0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
171d0 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
171e0 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
171f0 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
17200 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
17210 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
17220 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
17230 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
17240 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
17250 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
17260 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
17270 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
17280 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
17290 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
172a0 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
172b0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
172c0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
172d0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
172e0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
172f0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
17300 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
17310 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
17320 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
17330 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
17340 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
17350 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
17360 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
17370 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
17380 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
17390 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
173a0 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
173b0 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
173c0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
173d0 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
173e0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
173f0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
17400 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
17410 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
17420 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
17430 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
17440 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
17450 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
17460 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
17470 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
17480 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
17490 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
174a0 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
174b0 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
174c0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
174d0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
174e0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
174f0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
17500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
17510 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20  *.** If clrFlag 
17520 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61  is false, the pa
17530 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
17540 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
17550 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63  om disk..** If c
17560 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  lfFlag is true, 
17570 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  it means the pag
17580 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
17590 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72   erased and.** r
175a0 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74  ewritten without
175b0 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65 61   first being rea
175c0 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  d so there is no
175d0 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a   point it doing.
175e0 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e  ** the disk I/O.
175f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
17600 61 67 65 72 41 63 71 75 69 72 65 28 50 61 67 65  agerAcquire(Page
17610 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
17620 70 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70  pgno, DbPage **p
17630 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c  pPage, int clrFl
17640 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
17650 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
17660 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17670 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17680 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
17690 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
176a0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
176b0 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
176c0 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
176d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
176e0 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
176f0 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
17700 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
17710 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
17720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
17730 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
17740 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
17750 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
17760 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
17770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
17780 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
17790 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
177a0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
177b0 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
177c0 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
177d0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
177e0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
177f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
17800 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
17810 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
17820 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  TE_FULL ){.    r
17830 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17840 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
17850 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
17860 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
17870 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
17880 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
17890 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
178a0 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72   file. pagerShar
178b0 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  edLock() is a no
178c0 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64  -op if .  ** a d
178d0 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20  atabase lock is 
178e0 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20  already held..  
178f0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53  */.  rc = pagerS
17900 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72  haredLock(pPager
17910 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
17930 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
17940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17950 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
17960 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70  CK );..  pPg = p
17970 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
17980 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
17990 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
179a0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
179b0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
179c0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
179d0 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  /.    int nMax;.
179e0 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 54      int h;.    T
179f0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
17a00 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66 28  >nMiss);.    if(
17a10 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
17a20 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
17a30 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
17a40 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a 20  =0 || MEMDB ||. 
17a50 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e         (pPager->
17a60 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
17a70 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  && pPager->doNot
17a80 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20 20  Sync).    ){.   
17a90 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e     /* Create a n
17aa0 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ew page */.     
17ab0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
17ac0 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73  ge>=pPager->nHas
17ad0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67  h ){.        pag
17ae0 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
17af0 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
17b00 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17b10 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
17b20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
17b30 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
17b40 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30  pPager->nHash==0
17b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
17b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
17b70 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
17b80 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20 3d     }.      pPg =
17b90 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
17ba0 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b  ( sizeof(*pPg) +
17bb0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17bc0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
17bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17be0 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20  + sizeof(u32) + 
17bf0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20  pPager->nExtra. 
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d               + M
17c20 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
17c30 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20  story) );.      
17c40 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
17c50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17c60 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
17c70 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
17c80 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  pPg, 0, sizeof(*
17c90 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28  pPg));.      if(
17ca0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
17cb0 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
17cc0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17cd0 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
17ce0 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
17cf0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70    }.      pPg->p
17d00 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
17d10 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
17d20 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
17d30 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  ll;.      pPager
17d40 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
17d50 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
17d60 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
17d70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61  Pager->nPage>pPa
17d80 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b  ger->nMaxPage ){
17d90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17da0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
17db0 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67  e==(pPager->nPag
17dc0 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  e-1) );.        
17dd0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
17de0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
17df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17e00 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28  = pager_recycle(
17e10 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 29  pPager, 1, &pPg)
17e20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
17e30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17e40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17e50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
17e60 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17e70 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
17e80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
17e90 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
17ea0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
17eb0 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  o;.    if( pPage
17ec0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->aInJournal &&
17ed0 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
17ee0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
17ef0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
17f00 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65  heckMemory(pPage
17f10 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->aInJournal, p
17f20 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73  gno/8);.      as
17f30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
17f40 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
17f50 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17f60 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e  l = (pPager->aIn
17f70 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20  Journal[pgno/8] 
17f80 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29  & (1<<(pgno&7)))
17f90 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  !=0;.      pPg->
17fa0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
17fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17fc0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
17fd0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
17fe0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
17ff0 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
18000 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e  ->aInStmt && (in
18010 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  t)pgno<=pPager->
18020 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20  stmtSize.       
18030 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72        && (pPager
18040 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38  ->aInStmt[pgno/8
18050 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
18060 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ))!=0 ){.      p
18070 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
18080 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d  list(pPg);.    }
18090 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65  else{.      page
180a0 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d  _remove_from_stm
180b0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
180c0 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e   }.    makeClean
180d0 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e  (pPg);.    pPg->
180e0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45  nRef = 1;.    RE
180f0 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20  FINFO(pPg);..   
18100 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
18110 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
18120 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
18130 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
18140 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
18150 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
18160 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
18170 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
18180 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18190 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
181a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
181b0 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
181c0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
181d0 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  g);.      rc = p
181e0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
181f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18200 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
18210 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
18220 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
18230 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
18240 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
18250 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
18260 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
18270 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
18280 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
18290 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
182a0 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 63  o || MEMDB || (c
182b0 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67 65  lrFlag && !pPage
182c0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
182d0 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  k) ){.      mems
182e0 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
182f0 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
18300 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
18320 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
18330 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
18340 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
18350 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
18360 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
18370 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
18380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
183a0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
183b0 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
183c0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20  TO_DATA(pPg),.  
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
183f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54       }.      IOT
18410 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
18420 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
18430 6e 6f 29 29 0a 20 20 20 20 20 20 50 41 47 45 52  no)).      PAGER
18440 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
18450 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18460 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18470 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18480 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
18490 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
184a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
184b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
184c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
184d0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
184e0 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
184f0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
18500 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
18510 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
18520 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
18530 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73  n rc;.      }els
18540 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f  e{.        TEST_
18550 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
18560 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ad);.      }.   
18570 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
18580 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
18590 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
185a0 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
185b0 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
185c0 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
185d0 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
185e0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
185f0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
18600 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
18610 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
18620 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
18630 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
18640 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
18650 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
18660 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
18670 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
18680 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
18690 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
186a0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
186b0 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
186c0 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
186d0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
186e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
186f0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
18700 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
18710 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
18720 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
18730 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
18740 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43  1);.    TEST_INC
18750 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
18760 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50  .    page_ref(pP
18770 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  g);.  }.  *ppPag
18780 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72  e = pPg;.  retur
18790 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
187a0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
187b0 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c  page if it is al
187c0 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d  ready in the in-
187d0 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44  memory cache.  D
187e0 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68  o.** not read th
187f0 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b  e page from disk
18800 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
18810 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ter to the page,
18820 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20  .** or 0 if the 
18830 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
18840 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  ache..**.** See 
18850 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18860 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66  rGet().  The dif
18870 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
18880 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
18890 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
188a0 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  Get() is that _g
188b0 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
188c0 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
188d0 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
188e0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
188f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
18900 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
18910 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
18920 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
18930 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
18940 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
18950 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
18960 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
18970 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33  .DbPage *sqlite3
18980 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65  PagerLookup(Page
18990 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
189a0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
189b0 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pPg;..  assert( 
189c0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
189d0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
189e0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
189f0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
18a00 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
18a10 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c  rt( !pPager->pAl
18a20 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63  l || pPager->exc
18a30 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20  lusiveMode );.  
18a40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
18a50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18a60 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
18a70 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
18a80 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
18a90 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
18aa0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
18ab0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
18ac0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
18ad0 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
18ae0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
18af0 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n pPg;.}../*.** 
18b00 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a  Release a page..
18b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
18b20 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
18b30 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72  s to the page dr
18b40 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e  op to zero, then
18b50 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20   the.** page is 
18b60 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55  added to the LRU
18b70 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c   list.  When all
18b80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
18b90 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20  ll pages.** are 
18ba0 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c  released, a roll
18bb0 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20  back occurs and 
18bc0 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  the lock on the 
18bd0 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72  database is.** r
18be0 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
18bf0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
18c00 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a  (DbPage *pPg){..
18c10 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
18c20 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
18c30 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  nt for this page
18c40 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18c50 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
18c60 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pPg->nRef--;.  
18c70 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
18c80 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
18c90 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
18ca0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
18cb0 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
18cc0 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
18cd0 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
18ce0 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
18cf0 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
18d00 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
18d10 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
18d20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
18d30 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
18d40 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
18d50 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
18d60 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
18d70 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
18d80 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
18d90 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
18da0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
18db0 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
18dc0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
18dd0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
18de0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18df0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
18e00 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
18e10 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
18e20 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
18e30 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
18e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
18e50 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
18e60 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
18e70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
18e80 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
18e90 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
18ea0 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67  ructor(pPg, pPag
18eb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18ec0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57     }.  .    /* W
18ed0 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65  hen all pages re
18ee0 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74  ach the freelist
18ef0 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20  , drop the read 
18f00 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  lock from.    **
18f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18f20 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
18f30 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
18f40 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18f50 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20  r->nRef>=0 );.  
18f60 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52    if( pPager->nR
18f70 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65  ef==0 && (!pPage
18f80 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
18f90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
18fa0 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20  nalOff>0) ){.   
18fb0 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e     pagerUnlockAn
18fc0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
18fd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
18fe0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18ff0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
19000 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
19010 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65  for pPager.  The
19020 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  re should alread
19030 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a  y be a RESERVED.
19040 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ** or EXCLUSIVE 
19050 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19060 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74  base file when t
19070 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
19080 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  alled..**.** Ret
19090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
190a0 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65   everything.  Re
190b0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
190c0 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  de and release t
190d0 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b  he.** write lock
190e0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
190f0 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
19100 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65  ic int pager_ope
19110 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  n_journal(Pager 
19120 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
19130 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d  rc;.  assert( !M
19140 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  EMDB );.  assert
19150 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
19160 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
19170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
19180 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19190 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
191a0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
191b0 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nal );.  assert(
191c0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
191d0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  nal==0 );.  sqli
191e0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
191f0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
19200 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19210 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
19220 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
19230 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
19240 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19250 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
19260 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19270 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
19280 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
19290 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
192a0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
192b0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
192c0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
192d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192f0 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
19300 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
19310 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
19320 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
19330 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
19340 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
19350 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
19370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
19380 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
19390 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
193a0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
193b0 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61 69    }.    goto fai
193c0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
193d0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nal;.  }.  sqlit
193e0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
193f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
19400 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29  ger->full_fsync)
19410 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  ;.  sqlite3OsSet
19420 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
19430 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c  >fd, pPager->ful
19440 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69  l_fsync);.  sqli
19450 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  te3OsOpenDirecto
19460 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ry(pPager->jfd, 
19470 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
19480 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ry);.  pPager->j
19490 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
194a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
194b0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
194c0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
194d0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
194e0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
194f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
19500 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
19510 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
19520 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
19530 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 67  ->errCode;.    g
19540 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
19550 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
19560 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
19570 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
19580 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
19590 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
195a0 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
195b0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
195c0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
195d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
195e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
195f0 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a  tBegin(pPager);.
19600 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
19610 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
19620 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  QLITE_NOMEM ){. 
19630 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
19640 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
19650 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
19680 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LL;.    }.  }.  
19690 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c  return rc;..fail
196a0 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
196b0 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65  al:.  sqliteFree
196c0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
196d0 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
196e0 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
196f0 23 69 66 20 30 0a 20 20 69 66 28 20 72 63 3d 3d  #if 0.  if( rc==
19700 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
19710 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
19720 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  as a malloc() fa
19730 69 6c 75 72 65 2c 20 74 68 65 6e 20 77 65 20 77  ilure, then we w
19740 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c 6f 73 69  ill not be closi
19750 6e 67 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ng the pager.   
19760 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20 64 65 6c   ** file. So del
19770 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e 61 6c 20  ete any journal 
19780 66 69 6c 65 20 77 65 20 6d 61 79 20 68 61 76 65  file we may have
19790 20 6a 75 73 74 20 63 72 65 61 74 65 64 2e 20 4f   just created. O
197a0 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20 2a 2a  therwise,.    **
197b0 20 74 68 65 20 73 79 73 74 65 6d 20 77 69 6c 6c   the system will
197c0 20 67 65 74 20 63 6f 6e 66 75 73 65 64 2c 20 77   get confused, w
197d0 65 20 68 61 76 65 20 61 20 72 65 61 64 2d 6c 6f  e have a read-lo
197e0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ck on the file a
197f0 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d 79 73 74  nd a.    ** myst
19800 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  erious journal h
19810 61 73 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  as appeared in t
19820 68 65 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a 20  he filesystem.. 
19830 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c     */.    /* sql
19840 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
19850 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 20  ger->zJournal); 
19860 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
19870 2f 2a 20 49 66 20 77 65 20 72 65 73 65 74 20 74  /* If we reset t
19880 68 65 20 70 61 67 65 72 20 68 65 72 65 2c 20 77  he pager here, w
19890 65 20 77 69 6c 6c 20 64 65 6c 65 74 65 20 70 61  e will delete pa
198a0 67 65 73 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ges out from und
198b0 65 72 0a 20 20 20 20 2a 2a 20 76 61 72 69 6f 75  er.    ** variou
198c0 73 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 69  s cursors and wi
198d0 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 73 65  ll ultimately se
198e0 67 66 61 75 6c 74 2e 20 2a 2f 0a 20 20 20 20 2f  gfault. */.    /
198f0 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50  * pager_reset(pP
19900 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 23 65  ager); */.  }.#e
19910 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63  ndif.  return rc
19920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
19930 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
19940 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
19950 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
19960 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
19970 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
19980 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
19990 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
199a0 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 69  3PagerCommit() i
199b0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
199c0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
199d0 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
199e0 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
199f0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
19a00 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
19a10 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
19a20 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
19a30 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
19a40 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
19a50 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
19a60 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
19a70 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
19a80 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
19a90 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
19aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
19ab0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
19ac0 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
19ad0 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
19ae0 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
19af0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
19b00 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
19b10 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
19b20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
19b30 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
19b40 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19b50 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
19b60 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
19b70 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
19b80 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
19b90 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
19ba0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
19bb0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
19bc0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
19bd0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
19be0 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
19bf0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
19c00 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
19c10 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
19c20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
19c30 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
19c40 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
19c50 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
19c60 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
19c70 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
19c80 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
19c90 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
19ca0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
19cb0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
19cc0 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
19cd0 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
19ce0 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
19cf0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19d00 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
19d10 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
19d20 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
19d30 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
19d40 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
19d50 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
19d60 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
19d70 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
19d80 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
19d90 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
19da0 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
19db0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
19dc0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
19dd0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
19de0 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
19df0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
19e00 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
19e10 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
19e20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
19e30 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
19e40 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
19e50 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19e60 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
19e70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
19e80 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
19e90 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
19ea0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
19eb0 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
19ec0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19ed0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
19ee0 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
19ef0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
19f00 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
19f10 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
19f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19f30 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
19f40 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
19f50 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
19f60 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
19f70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19f80 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19f90 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
19fa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
19fb0 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
19fc0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
19fd0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
19fe0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
19ff0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a000 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1a010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1a030 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1a040 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1a050 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
1a060 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1a070 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1a080 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a090 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1a0a0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1a0b0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1a0c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
1a0d0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1a0e0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1a0f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1a100 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1a110 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1a120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a130 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1a140 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1a150 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1a160 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1a170 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
1a180 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1a190 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1a1a0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1a1b0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1a1c0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1a1d0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1a1e0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1a1f0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1a200 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1a210 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1a220 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1a230 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
1a240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a250 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1a260 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a270 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
1a280 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1a290 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1a2a0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1a2b0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1a2c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1a2d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a2e0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
1a2f0 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
1a300 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20  ze/8 + 1 );.    
1a310 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e  if( !pPager->aIn
1a320 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
1a330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1a340 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
1a350 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
1a360 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
1a370 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
1a380 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a390 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
1a3a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a3b0 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  f>0 || rc!=SQLIT
1a3c0 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
1a3d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1a3e0 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79 2e  ke a page dirty.
1a3f0 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79 20    Set its dirty 
1a400 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74 20  flag and add it 
1a410 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a 20  to the dirty.** 
1a420 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1a430 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44 69  atic void makeDi
1a440 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29 7b  rty(PgHdr *pPg){
1a450 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1a460 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  y==0 ){.    Page
1a470 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1a480 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1a490 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1a4a0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 70   pPg->pDirty = p
1a4b0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 20  Pager->pDirty;. 
1a4c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
1a4d0 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1a4e0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70  Pager->pDirty->p
1a4f0 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67 3b  PrevDirty = pPg;
1a500 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
1a510 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b 0a  pPrevDirty = 0;.
1a520 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1a530 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a  ty = pPg;.  }.}.
1a540 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61  ./*.** Make a pa
1a550 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61 72  ge clean.  Clear
1a560 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20 61   its dirty bit a
1a570 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  nd remove it fro
1a580 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20 70  m the.** dirty p
1a590 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  age list..*/.sta
1a5a0 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
1a5b0 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  an(PgHdr *pPg){.
1a5c0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
1a5d0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72   ){.    pPg->dir
1a5e0 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1a5f0 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20  pPg->pDirty ){. 
1a600 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
1a610 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1a620 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
1a630 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
1a640 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
1a650 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
1a660 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d  vDirty->pDirty =
1a670 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
1a680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1a690 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
1a6a0 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
1a6b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  ;.    }.  }.}...
1a6c0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
1a6d0 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
1a6e0 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
1a6f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1a700 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
1a710 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1a720 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
1a730 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
1a740 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
1a750 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
1a760 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
1a770 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
1a780 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a790 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
1a7a0 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
1a7b0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
1a7c0 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
1a7d0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
1a7e0 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
1a7f0 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
1a800 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
1a810 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
1a820 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1a830 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
1a840 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
1a850 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
1a860 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
1a870 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
1a880 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
1a890 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
1a8a0 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
1a8b0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
1a8c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
1a8d0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1a8e0 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
1a8f0 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
1a900 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
1a910 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
1a920 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1a930 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
1a940 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
1a950 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
1a960 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
1a970 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
1a980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1a990 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
1a9a0 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
1a9b0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1a9c0 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 50  it() or sqlite3P
1a9d0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20 74  agerRollback() t
1a9e0 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 73  o.** reset..*/.s
1a9f0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1aa00 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50 67  write(PgHdr *pPg
1aa10 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74 61  ){.  void *pData
1aa20 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
1aa30 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20 2a  (pPg);.  Pager *
1aa40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1aa50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1aa60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
1aa70 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
1aa80 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
1aa90 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
1aaa0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61   .    return pPa
1aab0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1aac0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
1aad0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
1aae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
1aaf0 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  RM;.  }..  asser
1ab00 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  t( !pPager->setM
1ab10 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43  aster );..  CHEC
1ab20 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1ab30 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1ab40 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1ab50 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1ab60 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1ab70 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1ab80 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1ab90 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1aba0 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
1abb0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
1abc0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1abd0 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && (pPg->inStmt 
1abe0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
1abf0 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
1ac00 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1ac10 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
1ac20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
1ac30 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
1ac40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1ac50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
1ac60 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
1ac70 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
1ac80 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
1ac90 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
1aca0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
1acb0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
1acc0 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
1acd0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
1ace0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1acf0 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
1ad00 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
1ad10 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
1ad20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1ad30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1ad40 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1ad50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ad60 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
1ad70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1ad80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ad90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ada0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1adb0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1adc0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1add0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1ade0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
1adf0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
1ae00 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1ae10 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
1ae20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
1ae30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ae40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1ae50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1ae60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1ae70 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
1ae80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1ae90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1aea0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
1aeb0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
1aec0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1aed0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
1aee0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
1aef0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
1af00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1af10 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
1af20 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
1af30 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
1af40 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
1af50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1af60 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
1af70 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
1af80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1af90 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
1afa0 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
1afb0 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
1afc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
1afd0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1afe0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1aff0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
1b000 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69   szPg;.        i
1b010 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
1b020 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1b030 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1b040 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1b050 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50  er);.          P
1b060 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52  AGERTRACE3("JOUR
1b070 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1b080 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1b090 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1b0a0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b0b0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d  ( pHist->pOrig==
1b0c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
1b0d0 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71  Hist->pOrig = sq
1b0e0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
1b0f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1b100 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1b110 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b   pHist->pOrig ){
1b120 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1b130 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
1b140 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1b150 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1b160 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1b170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1b180 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33  se{.          u3
1b190 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a  2 cksum, saved;.
1b1a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1b1b0 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20  pData2, *pEnd;. 
1b1c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
1b1d0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
1b1e0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1b1f0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
1b200 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
1b210 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
1b220 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
1b230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1b240 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
1b250 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1b260 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
1b270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b280 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
1b290 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1b2a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
1b2b0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1b2c0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1b2d0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
1b2e0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
1b2f0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
1b300 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
1b310 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20           pEnd = 
1b320 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d  pData2 + pPager-
1b330 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
1b340 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34       pData2 -= 4
1b350 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65  ;.          save
1b360 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b  d = *(u32*)pEnd;
1b370 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1b380 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d  bits(pEnd, cksum
1b390 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
1b3a0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
1b3b0 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
1b3c0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1b3d0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1b3e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1b3f0 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1b400 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61  ager->jfd, pData
1b410 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  2, szPg);.      
1b420 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f      IOTRACE(("JO
1b430 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64  UT %p %d %lld %d
1b440 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1b450 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
1b460 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1b470 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73  r->journalOff, s
1b480 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20 20  zPg)).          
1b490 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b4a0 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1b4b0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1b4c0 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1b4d0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1b4e0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1b4f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1b500 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1b510 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1b520 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1b530 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1b540 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1b550 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1b560 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1b570 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1b580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1b590 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1b5a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1b5b0 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1b5c0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1b5d0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1b5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b5f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b600 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1b610 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1b620 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1b630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b640 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b650 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1b660 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b670 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1b680 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1b690 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1b6a0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1b6b0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1b6c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1b6d0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1b6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b6f0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1b700 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1b710 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1b720 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
1b730 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1b740 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ist(pPg);.      
1b750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1b760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1b770 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1b780 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f  nc = !pPager->jo
1b790 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
1b7a0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1b7b0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1b7c0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
1b7d0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1b7e0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1b7f0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1b800 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1b810 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1b820 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1b830 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
1b840 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
1b850 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1b860 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1b870 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1b880 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
1b890 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
1b8a0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1b8b0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
1b8c0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
1b8d0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
1b8e0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1b8f0 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
1b900 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
1b910 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
1b920 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1b930 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
1b940 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
1b950 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
1b960 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
1b970 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
1b980 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
1b990 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
1b9a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
1b9b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
1b9c0 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
1b9d0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
1b9e0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
1b9f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
1ba00 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1ba10 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
1ba20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
1ba30 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
1ba40 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1ba50 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1ba60 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1ba70 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1ba80 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
1ba90 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
1baa0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
1bab0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
1bac0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1bad0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1bae0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1baf0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
1bb00 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1bb10 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
1bb20 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1bb30 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1bb40 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
1bb50 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1bb60 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1bb70 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1bb80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1bb90 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1bba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bbb0 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20     char *pData2 
1bbc0 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1bbd0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
1bbe0 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20  o, 7)-4;.       
1bbf0 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
1bc00 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
1bc10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1bc20 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1bc30 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c  r->stfd, pData2,
1bc40 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1bc50 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50 41  e+4);.        PA
1bc60 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
1bc70 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1bc80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1bc90 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1bca0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1bcb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1bcc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1bcd0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1bce0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1bcf0 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
1bd00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bd10 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1bd20 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
1bd30 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1bd40 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1bd50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1bd60 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61    }.      page_a
1bd70 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1bd80 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
1bd90 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
1bda0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
1bdb0 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
1bdc0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1bdd0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1bde0 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70  HARED );.  if( p
1bdf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69  Pager->dbSize<(i
1be00 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a  nt)pPg->pgno ){.
1be10 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
1be20 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  ze = pPg->pgno;.
1be30 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26      if( !MEMDB &
1be40 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
1be50 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
1be60 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1be70 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1be80 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d  >dbSize++;.    }
1be90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1bea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1beb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1bec0 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d   to mark a data-
1bed0 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65  page as writable
1bee0 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61  . It uses .** pa
1bef0 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f  ger_write() to o
1bf00 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1bf10 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74  le (if it is not
1bf20 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a   already open).*
1bf30 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  * and write the 
1bf40 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74  page *pData to t
1bf50 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
1bf60 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
1bf70 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
1bf80 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72  nction and pager
1bf90 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74  _write() is that
1bfa0 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1bfb0 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74  n also deals wit
1bfc0 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61  h the special ca
1bfd0 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f  se where 2 or mo
1bfe0 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20  re pages.** fit 
1bff0 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b  on a single disk
1c000 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73   sector. In this
1c010 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73   case all co-res
1c020 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d  ident pages.** m
1c030 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72  ust have been wr
1c040 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1c050 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65  rnal file before
1c060 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
1c070 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  nt sqlite3PagerW
1c080 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62  rite(DbPage *pDb
1c090 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Page){.  int rc 
1c0a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c0b0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1c0c0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1c0d0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c0e0 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67  ger;.  Pgno nPag
1c0f0 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50  ePerSector = (pP
1c100 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
1c110 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
1c120 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44  e);..  if( !MEMD
1c130 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63  B && nPagePerSec
1c140 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
1c150 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
1c160 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
1c170 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1c180 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
1c190 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
1c1a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c1b0 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1c1c0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1c1d0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1c1e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
1c1f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c200 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1c210 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
1c220 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
1c230 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  */.    int ii;..
1c240 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
1c250 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
1c260 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
1c270 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
1c280 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
1c290 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
1c2a0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
1c2b0 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
1c2c0 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
1c2d0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
1c2e0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c2f0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
1c300 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1c310 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
1c320 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
1c330 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
1c340 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
1c350 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
1c360 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
1c370 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
1c380 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
1c390 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
1c3a0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
1c3b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
1c3c0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1c3d0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1c3e0 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
1c3f0 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
1c400 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
1c410 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
1c420 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
1c430 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1c440 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1c450 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
1c460 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
1c470 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
1c480 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
1c490 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
1c4a0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
1c4b0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
1c4c0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1c4d0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
1c4e0 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
1c4f0 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1c500 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
1c510 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c520 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
1c530 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
1c540 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
1c550 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
1c560 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
1c570 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
1c580 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
1c590 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
1c5a0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
1c5b0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  i;.      if( !pP
1c5c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1c5d0 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e   || pg==pPg->pgn
1c5e0 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  o || .          
1c5f0 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  pg>pPager->origD
1c600 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65  bSize || !(pPage
1c610 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1c620 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29  /8]&(1<<(pg&7)))
1c630 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20  .      ) {.     
1c640 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
1c650 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1c660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
1c670 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
1c680 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c690 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1c6a0 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a  r, pg, &pPage);.
1c6b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c6c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c6d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1c6e0 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67  pager_write(pPag
1c6f0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1c700 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1c710 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1c720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1c730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c740 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c750 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
1c760 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1c770 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
1c780 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
1c790 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
1c7a0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1c7b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1c7c0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
1c7d0 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e  he page given in
1c7e0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61   the argument wa
1c7f0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73  s previously pas
1c800 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  sed.** to sqlite
1c810 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20  3PagerWrite().  
1c820 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c830 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
1c840 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
1c850 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
1c860 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
1c870 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1c880 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1c890 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61  Iswriteable(DbPa
1c8a0 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
1c8b0 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
1c8c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
1c8d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
1c8e0 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
1c8f0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1c900 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
1c910 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
1c920 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
1c930 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
1c940 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c950 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72  rOverwrite(Pager
1c960 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1c970 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61  gno, void *pData
1c980 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1c990 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
1c9a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1c9b0 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  et(pPager, pgno,
1c9c0 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63   &pPg);.  if( rc
1c9d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c9e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c9f0 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
1ca00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ca10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d  TE_OK ){.      m
1ca20 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67  emcpy(sqlite3Pag
1ca30 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20  erGetData(pPg), 
1ca40 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
1ca50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1ca60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ca70 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  Unref(pPg);.  }.
1ca80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
1ca90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
1caa0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
1cab0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
1cac0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
1cad0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
1cae0 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
1caf0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
1cb00 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20   "pgno" back to 
1cb10 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
1cb20 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
1cb30 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
1cb40 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
1cb50 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
1cb60 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
1cb70 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1cb80 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
1cb90 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
1cba0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
1cbb0 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
1cbc0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
1cbd0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
1cbe0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
1cbf0 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
1cc00 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
1cc10 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
1cc20 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
1cc30 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
1cc40 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
1cc50 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1cc60 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
1cc70 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
1cc80 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
1cc90 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
1cca0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
1ccb0 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
1ccc0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
1ccd0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1cce0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
1ccf0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1cd00 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
1cd10 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
1cd20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1cd30 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1cd40 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
1cd50 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
1cd60 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
1cd70 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
1cd80 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
1cd90 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
1cda0 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
1cdb0 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
1cdc0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1cdd0 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
1cde0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
1cdf0 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
1ce00 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
1ce10 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
1ce20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
1ce30 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
1ce40 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
1ce50 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1ce60 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
1ce70 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
1ce80 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
1ce90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1cea0 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
1ceb0 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74  sed,.** the dont
1cec0 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  _rollback() rout
1ced0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
1cee0 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
1cef0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  page contains.**
1cf00 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
1cf10 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
1cf20 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
1cf30 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1cf40 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20  spite.** of the 
1cf50 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
1cf60 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1cf70 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1cf80 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1cf90 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1cfa0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1cfb0 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1cfc0 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1cfd0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1cfe0 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
1cff0 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a  t( pPg!=0 );  /*
1d000 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f   We never call _
1d010 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73  dont_write unles
1d020 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  s the page is in
1d030 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61   mem */.  pPg->a
1d040 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1d050 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1d060 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1d070 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d080 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d090 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1d0a0 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1d0b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1d0c0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1d0d0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1d0e0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1d0f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1d100 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1d110 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1d120 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1d130 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1d140 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1d150 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1d160 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1d170 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1d180 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1d190 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1d1a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1d1b0 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1d1c0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1d1d0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1d1e0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1d1f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1d200 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1d210 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1d220 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1d230 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1d240 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1d250 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1d260 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1d270 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1d280 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1d290 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1d2a0 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1d2b0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1d2c0 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1d2d0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1d2e0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1d2f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d300 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1d310 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1d320 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  d of %d\n", pgno
1d330 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d340 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1d350 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
1d360 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d370 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
1d380 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
1d390 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1d3a0 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
1d3b0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1d3c0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1d3d0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
1d3e0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1d3f0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1d400 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1d410 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
1d420 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
1d430 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1d440 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d450 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
1d460 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
1d470 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d480 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
1d490 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
1d4a0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
1d4b0 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
1d4c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
1d4d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1d4e0 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
1d4f0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1d500 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d510 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
1d520 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d530 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d540 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1d550 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1d560 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1d570 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1d580 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
1d590 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1d5a0 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1d5b0 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
1d5c0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1d5d0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1d5e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1d5f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1d600 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1d610 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1d620 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1d630 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1d640 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1d650 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1d660 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
1d670 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d680 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1d690 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1d6a0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1d6b0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1d6c0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1d6d0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1d6e0 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52     }.    PAGERTR
1d6f0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1d700 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1d710 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1d720 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1d730 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
1d740 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
1d750 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1d760 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
1d770 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d780 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1d790 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1d7a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1d7b0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
1d7c0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1d7d0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1d7e0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1d7f0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1d800 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d810 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1d820 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1d830 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1d840 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1d850 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
1d860 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1d870 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
1d880 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1d890 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1d8a0 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1d8b0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1d8c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1d8d0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1d8e0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1d8f0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1d900 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1d910 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1d920 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1d930 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1d940 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1d950 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1d960 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1d970 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
1d980 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1d990 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69  PgHdr *pPg;..  i
1d9a0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1d9b0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
1d9c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d9d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1d9e0 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
1d9f0 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
1da00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1da10 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52  ROR;.  }.  PAGER
1da20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25  TRACE2("COMMIT %
1da30 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1da40 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1da50 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d  MDB ){.    pPg =
1da60 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1da70 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1da80 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  r);.    while( p
1da90 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61  Pg ){.      clea
1daa0 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54  rHistory(PGHDR_T
1dab0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1dac0 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  er));.      pPg-
1dad0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1dae0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1daf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1db00 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
1db10 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1db20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1db30 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
1db40 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
1db50 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
1db60 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
1db70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1db80 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
1db90 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
1dba0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1dbb0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1dbc0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1dbd0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1dbe0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1dbf0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1dc00 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1dc10 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1dc20 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
1dc30 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
1dc40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1dc50 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
1dc60 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1dc70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1dc80 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1dc90 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1dca0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1dcb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dcc0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1dcd0 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
1dce0 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
1dcf0 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
1dd00 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
1dd10 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
1dd20 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
1dd30 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
1dd40 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
1dd50 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1dd60 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
1dd70 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1dd80 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1dd90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1dda0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1ddb0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
1ddc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ddd0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1dde0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ddf0 67 65 72 53 79 6e 63 28 70 50 61 67 65 72 2c 20  gerSync(pPager, 
1de00 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  0, 0);.    if( r
1de10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1de30 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
1de40 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1de50 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1de60 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1de70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1de80 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1de90 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1dea0 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1deb0 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1dec0 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1ded0 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1dee0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1def0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1df00 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1df10 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1df20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1df30 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1df40 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1df50 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1df60 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1df70 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1df80 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1df90 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1dfa0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1dfb0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1dfc0 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1dfd0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1dfe0 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1dff0 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1e000 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1e010 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1e020 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1e030 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1e040 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1e050 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1e060 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1e070 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1e080 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1e090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e0a0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67  agerRollback(Pag
1e0b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1e0c0 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52  nt rc;.  PAGERTR
1e0d0 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25  ACE2("ROLLBACK %
1e0e0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1e0f0 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
1e100 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72  MDB ){.    PgHdr
1e110 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70   *p;.    for(p=p
1e120 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
1e130 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
1e140 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1e150 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73  *pHist;.      as
1e160 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73  sert( !p->always
1e170 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
1e180 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20    if( !p->dirty 
1e190 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e1a0 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20  t( !((PgHistory 
1e1b0 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  *)PGHDR_TO_HIST(
1e1c0 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72  p, pPager))->pOr
1e1d0 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ig );.        as
1e1e0 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
1e1f0 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
1e200 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
1e210 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  pStmt );.       
1e220 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1e230 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20   }..      pHist 
1e240 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1e250 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  p, pPager);.    
1e260 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
1e270 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  ig ){.        me
1e280 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1e290 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f  TA(p), pHist->pO
1e2a0 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  rig, pPager->pag
1e2b0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1e2c0 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c  PAGERTRACE3("ROL
1e2d0 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
1e2e0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
1e2f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e300 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e310 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1e320 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20  CE3("PAGE %d is 
1e330 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20  clean on %d\n", 
1e340 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
1e350 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1e360 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
1e370 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
1e380 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
1e390 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
1e3a0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
1e3b0 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  p->inStmt = 0;. 
1e3c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d       p->pPrevStm
1e3d0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74  t = p->pNextStmt
1e3e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
1e3f0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1e400 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
1e410 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
1e420 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1e430 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
1e440 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
1e450 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
1e460 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1e470 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1e480 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
1e490 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d  rigDbSize;.    m
1e4a0 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
1e4b0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1e4c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1e4d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1e4e0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
1e4f0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
1e500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
1e510 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
1e520 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
1e530 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1e540 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1e550 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
1e560 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
1e570 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
1e580 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1e590 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
1e5a0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
1e5b0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
1e5c0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1e5d0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
1e5e0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
1e5f0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
1e600 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1e610 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1e620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1e630 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1e640 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
1e650 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
1e660 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1e670 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
1e680 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e    rc2 = pager_un
1e690 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1e6a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1e6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e6c0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
1e6d0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
1e6e0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
1e6f0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
1e700 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
1e710 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20  ize = -1;..  /* 
1e720 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1e730 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c  rs during a ROLL
1e740 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20  BACK, we can no 
1e750 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65  longer trust the
1e760 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68   pager.  ** cach
1e770 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72  e. So call pager
1e780 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20  _error() on the 
1e790 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20  way out to make 
1e7a0 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20  any error .  ** 
1e7b0 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  persistent..  */
1e7c0 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
1e7d0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
1e7e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1e7f0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
1e800 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1e810 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
1e820 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
1e830 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
1e840 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
1e850 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
1e860 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
1e870 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
1e880 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1e890 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
1e8a0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nly;.}../*.** Re
1e8b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1e8c0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1e8d0 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69   the pager..*/.i
1e8e0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
1e8f0 65 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  efcount(Pager *p
1e900 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1e910 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d   pPager->nRef;.}
1e920 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e930 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
1e940 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
1e950 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
1e960 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
1e970 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
1e980 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
1e990 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
1e9a0 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
1e9b0 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52  [0] = pPager->nR
1e9c0 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61  ef;.  a[1] = pPa
1e9d0 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b  ger->nPage;.  a[
1e9e0 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50  2] = pPager->mxP
1e9f0 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  age;.  a[3] = pP
1ea00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
1ea10 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73  a[4] = pPager->s
1ea20 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70  tate;.  a[5] = p
1ea30 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1ea40 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
1ea50 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
1ea60 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
1ea70 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
1ea80 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
1ea90 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
1eaa0 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
1eab0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
1eac0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
1ead0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
1eae0 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
1eaf0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
1eb00 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1eb10 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
1eb20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1eb30 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
1eb40 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
1eb50 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1eb60 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1eb70 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1eb80 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1eb90 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1eba0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1ebb0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1ebc0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1ebd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
1ebe0 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
1ebf0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1ec00 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1ec10 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1ec20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ec30 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1ec40 53 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65  SHARED );.  asse
1ec50 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
1ec60 7a 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  ze>=0 );.  PAGER
1ec70 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47  TRACE2("STMT-BEG
1ec80 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IN %d\n", PAGERI
1ec90 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
1eca0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
1ecb0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ecc0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1ecd0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
1ece0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1ecf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ed00 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  K;.  }.  if( !pP
1ed10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1ed20 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  n ){.    pPager-
1ed30 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
1ed40 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1ed50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1ed60 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ed70 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
1ed80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1ed90 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1eda0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1edb0 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
1edc0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30  ager->aInStmt==0
1edd0 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
1ede0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
1edf0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1ee00 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ); */.    return
1ee10 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ee20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1ee30 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
1ee40 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
1ee50 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d  r->jfd, &pPager-
1ee60 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69  >stmtJSize);.  i
1ee70 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d  f( rc ) goto stm
1ee80 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a  t_begin_failed;.
1ee90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1eea0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70  ->stmtJSize == p
1eeb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1eec0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  f );.#endif.  pP
1eed0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
1eee0 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1eef0 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e  lOff;.  pPager->
1ef00 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
1ef10 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61  r->dbSize;.  pPa
1ef20 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20  ger->stmtHdrOff 
1ef30 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
1ef40 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65  tmtCksum = pPage
1ef50 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
1ef60 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  if( !pPager->stm
1ef70 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  tOpen ){.    rc 
1ef80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1ef90 65 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e  entemp(&pPager->
1efa0 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
1efb0 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1efc0 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
1efd0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1efe0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1eff0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1f000 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1f010 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
1f020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f030 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
1f040 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
1f050 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
1f060 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
1f070 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
1f080 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1f090 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
1f0a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0b0 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
1f0c0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1f0d0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
1f0e0 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1f0f0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1f100 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1f110 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
1f120 2a 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45  *pNext;.    PAGE
1f130 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f  RTRACE2("STMT-CO
1f140 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1f150 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1f160 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1f170 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1f180 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
1f190 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
1f1a0 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
1f1b0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1f1c0 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ); */.      sqli
1f1d0 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
1f1e0 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
1f1f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1f200 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1f210 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1f220 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1f230 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e  pNext){.      pN
1f240 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
1f250 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Stmt;.      asse
1f260 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  rt( pPg->inStmt 
1f270 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1f280 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1f290 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
1f2a0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
1f2b0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  = 0;.      if( M
1f2c0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1f2d0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1f2e0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1f2f0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1f300 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1f310 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1f320 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
1f330 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
1f340 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61   }.    }.    pPa
1f350 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1f360 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1f370 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
1f380 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
1f390 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  = 0;.  }.  pPage
1f3a0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1f3b0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1f3c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f3d0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61  * Rollback a sta
1f3e0 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  tement..*/.int s
1f3f0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52  qlite3PagerStmtR
1f400 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
1f410 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
1f420 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1f430 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1f440 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
1f450 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
1f460 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1f470 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
1f480 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
1f490 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f  r *pPg;.      fo
1f4a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
1f4b0 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  tmt; pPg; pPg=pP
1f4c0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20  g->pNextStmt){. 
1f4d0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1f4e0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1f4f0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1f500 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
1f510 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1f520 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1f530 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
1f540 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53  (pPg), pHist->pS
1f550 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  tmt, pPager->pag
1f560 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1f570 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
1f580 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
1f590 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1f5a0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  mt = 0;.        
1f5b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1f5c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1f5d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
1f5e0 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54  e;.      memoryT
1f5f0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
1f600 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1f610 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1f620 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1f630 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
1f640 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1f650 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f660 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
1f670 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1f680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1f690 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
1f6a0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
1f6b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f6c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f6d0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
1f6e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f6f0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
1f700 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
1f710 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
1f720 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1f730 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
1f740 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
1f750 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74  eturn the direct
1f760 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  ory of the datab
1f770 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1f780 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1f790 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67  PagerDirname(Pag
1f7a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1f7b0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44  eturn pPager->zD
1f7c0 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a  irectory;.}../*.
1f7d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1f7e0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1f7f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
1f800 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1f810 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72  sqlite3PagerJour
1f820 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
1f830 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
1f840 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
1f850 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  l;.}../*.** Retu
1f860 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63  rn true if fsync
1f870 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73  () calls are dis
1f880 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70  abled for this p
1f890 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ager.  Return FA
1f8a0 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28  LSE.** if fsync(
1f8b0 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20  )s are executed 
1f8c0 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  normally..*/.int
1f8d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
1f8e0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1f8f0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1f900 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
1f910 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1f920 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1f930 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1f940 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
1f950 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1f960 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
1f970 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
1f980 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
1f990 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
1f9a0 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
1f9b0 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
1f9c0 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
1f9d0 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 2f   pCodecArg;.}../
1f9e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1f9f0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
1fa00 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
1fa10 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
1fa20 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
1fa30 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
1fa40 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
1fa50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fa60 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1fa70 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
1fa80 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1fa90 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1faa0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1fab0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1fac0 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67  ( !pPager->chang
1fad0 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20  eCountDone ){.  
1fae0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31    /* Open page 1
1faf0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72   of the file for
1fb00 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20   writing. */.   
1fb10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb20 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c  erGet(pPager, 1,
1fb30 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
1fb40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fb50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fb60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fb70 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72 29  gerWrite(pPgHdr)
1fb80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1fb90 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1fba0 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52   rc;.  .    /* R
1fbb0 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1fbc0 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1fbd0 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
1fbe0 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65  counter = retrie
1fbf0 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c  ve32bits(pPgHdr,
1fc00 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   24);.  .    /* 
1fc10 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1fc20 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1fc30 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1fc40 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1fc50 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1fc60 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69  r++;.    put32bi
1fc70 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44 52  ts(((char*)PGHDR
1fc80 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29  _TO_DATA(pPgHdr)
1fc90 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75  )+24, change_cou
1fca0 6e 74 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  nter);.    pPage
1fcb0 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20  r->iChangeCount 
1fcc0 3d 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  = change_counter
1fcd0 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
1fce0 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66  ase the page ref
1fcf0 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73  erence. */.    s
1fd00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1fd10 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50  (pPgHdr);.    pP
1fd20 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
1fd30 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20  tDone = 1;.  }. 
1fd40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fd50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  K;.}../*.** Sync
1fd60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fd70 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72  le for the pager
1fd80 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72   pPager. zMaster
1fd90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e   points to the n
1fda0 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74  ame.** of a mast
1fdb0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1fdc0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
1fdd0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1fde0 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f  individual.** jo
1fdf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73  urnal file. zMas
1fe00 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c  ter may be NULL,
1fe10 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70   which is interp
1fe20 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74  reted as no mast
1fe30 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61  er.** journal (a
1fe40 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
1fe50 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
1fe60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1fe70 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74  e ensures that t
1fe80 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
1fe90 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20  nced, all dirty 
1fea0 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a  pages written.**
1feb0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1fec0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61   file and the da
1fed0 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63  tabase file sync
1fee0 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  ed. The only thi
1fef0 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69  ng that.** remai
1ff00 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
1ff10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1ff20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  to delete the jo
1ff30 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a  urnal file (or.*
1ff40 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1ff50 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
1ff60 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
1ff70 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
1ff80 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
1ff90 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
1ffa0 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
1ffb0 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
1ffc0 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
1ffd0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1ffe0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1fff0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
20000 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
20010 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
20020 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
20030 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
20040 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
20050 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
20060 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20070 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
20080 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
20090 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54  zMaster, Pgno nT
200a0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
200b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
200c0 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54  PAGERTRACE4("DAT
200d0 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65  ABASE SYNC: File
200e0 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e  =%s zMaster=%s n
200f0 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20  Trunc=%d\n", .  
20100 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c      pPager->zFil
20110 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20  ename, zMaster, 
20120 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49  nTrunc);..  /* I
20130 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d  f this is an in-
20140 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f  memory db, or no
20150 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
20160 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20   written to, or 
20170 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
20180 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
20190 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69  een called, it i
201a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
201b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
201c0 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45  ate!=PAGER_SYNCE
201d0 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70  D && !MEMDB && p
201e0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
201f0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
20200 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pPg;.    assert(
20210 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20220 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Open );..    /* 
20230 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
20240 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61  nal file name ha
20250 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
20260 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20  ritten to the.  
20270 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
20280 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20  e, then no sync 
20290 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  is required. Thi
202a0 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69  s happens when i
202b0 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74  t is.    ** writ
202c0 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72  ten, then the pr
202d0 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75  ocess fails to u
202e0 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45  pgrade from a RE
202f0 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20  SERVED to an.   
20300 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
20310 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d  ck. The next tim
20320 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72  e the process tr
20330 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ies to commit th
20340 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
20350 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d  tion the m-j nam
20360 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65  e will have alre
20370 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
20380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20390 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
203a0 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ter ){.      rc 
203b0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
203c0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
203d0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
203e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
203f0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69  to sync_exit;.#i
20400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20410 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20420 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
20430 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
20440 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
20450 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20  on has made the 
20460 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72  database smaller
20470 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  , then all pages
20480 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  .        ** bein
20490 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74  g discarded by t
204a0 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75  he truncation mu
204b0 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  st be written to
204c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
204d0 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20       ** file..  
204e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
204f0 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20   Pgno i;.       
20500 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47   int iSkip = PAG
20510 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
20520 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  r);.        for(
20530 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d   i=nTrunc+1; i<=
20540 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
20550 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20  ze; i++ ){.     
20560 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67 65       if( !(pPage
20570 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f  r->aInJournal[i/
20580 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29  8] & (1<<(i&7)))
20590 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
205a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
205b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
205c0 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
205d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
205e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
205f0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
20600 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
20610 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20620 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
20630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20640 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
20650 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20670 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20680 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
20690 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
206a0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
206b0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
206c0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
206d0 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
206e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
206f0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20700 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
20710 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
20720 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20730 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
20740 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
20750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20760 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
20770 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
20780 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20790 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
207a0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
207b0 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
207c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
207d0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
207e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
207f0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
20800 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
20810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20820 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
20830 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
20840 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
20850 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
20860 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
20870 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
20880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20890 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20   sync_exit;..   
208a0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
208b0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
208c0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
208d0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
208e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
208f0 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  nc(pPager->fd, 0
20900 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49 4f 54  );.    }.    IOT
20910 52 41 43 45 28 28 22 44 42 53 59 4e 43 20 25 70  RACE(("DBSYNC %p
20920 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20  \n", pPager)).. 
20930 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
20940 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
20950 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d 45 4d  .  }else if( MEM
20960 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d 30 20  DB && nTrunc!=0 
20970 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
20980 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
20990 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
209a0 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74  ;.  }..sync_exit
209b0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
209c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
209d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
209e0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
209f0 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
20a00 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61  by pData to loca
20a10 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
20a20 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   file. .**.** Th
20a30 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
20a40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20a50 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67   current page pg
20a60 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70  no. If current p
20a70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e  age.** pgno is n
20a80 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
20a90 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
20aa0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72  al, it is not wr
20ab0 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a  itten there by.*
20ac0 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  * by this routin
20ad0 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c  e. The same appl
20ae0 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ies to the page 
20af0 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20  pData refers to 
20b00 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  on entry to.** t
20b10 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
20b20 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
20b30 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
20b40 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65  d to by pData re
20b50 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
20b60 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
20b70 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
20b80 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61   with page pData
20b90 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
20ba0 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
20bb0 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
20bc0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
20bd0 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
20be0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
20bf0 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
20c00 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
20c10 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
20c20 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
20c30 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
20c40 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
20c50 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
20c60 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
20c70 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
20c80 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
20c90 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
20ca0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
20cb0 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
20cc0 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
20cd0 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
20ce0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
20cf0 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
20d00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
20d10 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
20d20 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
20d30 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
20d40 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
20d50 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
20d60 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
20d70 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
20d80 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
20d90 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
20da0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
20db0 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
20dc0 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
20dd0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
20de0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
20df0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
20e00 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
20e10 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
20e20 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
20e30 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
20e40 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
20e50 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
20e60 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
20e70 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
20e80 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
20e90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
20ea0 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
20eb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20ec0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
20ed0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
20ee0 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
20ef0 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
20f00 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
20f10 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
20f20 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
20f30 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
20f40 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
20f50 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
20f60 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
20f70 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
20f80 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
20f90 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
20fa0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
20fb0 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
20fc0 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
20fd0 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
20fe0 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
20ff0 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
21000 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
21010 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
21020 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
21030 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
21040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
21050 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
21060 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
21070 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
21080 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
21090 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
210a0 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
210b0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
210c0 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
210d0 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
210e0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
210f0 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
21100 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
21110 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21120 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
21130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21140 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
21150 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
21160 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
21170 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
21180 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  hain. */.  asser
21190 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
211a0 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
211b0 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28  ;.  h = pgno & (
211c0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
211d0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
211e0 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
211f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21200 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
21210 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
21220 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
21230 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
21240 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
21250 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
21260 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
21270 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
21280 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
21290 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b  Hash = 0;..  mak
212a0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70  eDirty(pPg);.  p
212b0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
212c0 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
212d0 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
212e0 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
212f0 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
21300 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
21310 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
21320 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
21330 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
21340 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
21350 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
21360 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
21370 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
21380 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
21390 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
213a0 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
213b0 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
213c0 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
213d0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
213e0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
213f0 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
21400 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
21410 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
21420 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
21430 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
21440 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
21450 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
21460 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
21470 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
21480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
21490 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
214a0 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
214b0 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
214c0 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
214d0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
214e0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48  .    PgHdr *pPgH
214f0 64 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  dr;.    assert( 
21500 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
21510 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
21520 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
21530 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e  ger, needSyncPgn
21540 6f 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  o, &pPgHdr);.   
21550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21560 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
21570 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
21580 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
21590 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  gHdr->needSync =
215a0 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
215b0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
215c0 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67     makeDirty(pPg
215d0 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Hdr);.    sqlite
215e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
215f0 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  dr);.  }..  retu
21600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21610 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
21620 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
21630 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  o the data for t
21640 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
21650 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
21660 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
21670 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
21680 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
21690 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
216a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
216b0 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
216c0 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f  r.nExtra bytes o
216d0 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  f "extra" space 
216e0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
216f0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65  ong with the spe
21700 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
21710 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
21720 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67  erGetExtra(DbPag
21730 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
21740 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21750 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
21760 20 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54   (pPager?PGHDR_T
21770 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
21780 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger):0);.}../*.*
21790 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f  * Get/set the lo
217a0 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74  cking-mode for t
217b0 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d  his pager. Param
217c0 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20  eter eMode must 
217d0 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47  be one.** of PAG
217e0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
217f0 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b  UERY, PAGER_LOCK
21800 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
21810 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  r .** PAGER_LOCK
21820 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
21830 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  E. If the parame
21840 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
21850 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  Y, then.** the l
21860 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73  ocking-mode is s
21870 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
21880 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
21890 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
218a0 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
218b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
218c0 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47  NORMAL or.** PAG
218d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
218e0 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61  XCLUSIVE, indica
218f0 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ting the current
21900 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
21910 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d  ed).** locking-m
21920 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
21930 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
21940 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
21950 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20  r, int eMode){. 
21960 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 29 7b   if( eMode>=0 ){
21970 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
21980 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
21990 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
219a0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
219b0 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
219c0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
219d0 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
219e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
219f0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
21a00 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
21a10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
21a20 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
21a30 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
21a40 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
21a50 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
21a60 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
21a70 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
21a80 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
21a90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
21aa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21ab0 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  rLockstate(Pager
21ac0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21ad0 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
21ae0 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66  kState(pPager->f
21af0 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  d);.}.#endif..#i
21b00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21b10 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
21b20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
21b30 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
21b40 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
21b50 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
21b60 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70  ite3PagerRefdump
21b70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21b80 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
21b90 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
21ba0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
21bb0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
21bc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
21bd0 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
21be0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
21bf0 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
21c00 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
21c10 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
21c20 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
21c30 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
21c40 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
21c50 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
21c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
21c70 4b 49 4f 20 2a 2f 0a                             KIO */.