/ Hex Artifact Content
Login

Artifact 680e42a6e0306f43b3e52127324a7bcc8d3ce65b:


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 33  : pager.c,v 1.33
0350: 34 20 32 30 30 37 2f 30 35 2f 30 34 20 31 32 3a  4 2007/05/04 12:
0360: 30 31 3a 30 33 20 64 72 68 20 45 78 70 20 24 0a  01:03 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61   */.  int nMaxPa
2f80: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
2f90: 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20    /* High water 
2fa0: 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f  mark of nPage */
2fb0: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
2fe0: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
2ff0: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
3000: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
3030: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
3040: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
3050: 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20  u8 *aInJournal; 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3070: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3080: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3090: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
30a0: 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20  8 *aInStmt;     
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
30c0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
30d0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
30e0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ase */.  char *z
30f0: 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
3100: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3110: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3120: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f  e */.  char *zJo
3130: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3140: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3150: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  e journal file *
3160: 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63  /.  char *zDirec
3170: 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  tory;           
3180: 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c  /* Directory hol
3190: 64 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  d database and j
31a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a    OsFile *fd, *j
31c0: 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fd;           /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
31f0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
3200: 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20  OsFile *stfd;   
3210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
3220: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
3230: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
3240: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
3250: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
3260: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
3270: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
3280: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
3290: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c    PgHdr *pFirst,
32a0: 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a   *pLast;      /*
32b0: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   List of free pa
32c0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
32d0: 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20  pFirstSynced;   
32e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72       /* First fr
32f0: 65 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48  ee page with PgH
3300: 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a  dr.needSync==0 *
3310: 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b  /.  PgHdr *pAll;
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3330: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70  /* List of all p
3340: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
3350: 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  *pStmt;         
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
3380: 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e  atement subjourn
3390: 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  al */.  PgHdr *p
33a0: 44 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  Dirty;          
33b0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
33c0: 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 2a  ll dirty pages *
33d0: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f  /.  i64 journalO
33e0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
33f0: 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65 20  /* Current byte 
3400: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f  offset in the jo
3410: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3420: 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20  i64 journalHdr; 
3430: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3440: 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72  yte offset to pr
3450: 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68  evious journal h
3460: 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73  eader */.  i64 s
3470: 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20  tmtHdrOff;      
3480: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
3490: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
34a0: 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61 74  ritten this stat
34b0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73  ement */.  i64 s
34c0: 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20  tmtCksum;       
34d0: 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49         /* cksumI
34e0: 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65  nit when stateme
34f0: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20 2a  nt was started *
3500: 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a  /.  i64 stmtJSiz
3510: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3520: 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e  /* Size of journ
3530: 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e  al at stmt_begin
3540: 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74  () */.  int sect
3550: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
3560: 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73      /* Assumed s
3570: 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e  ector size durin
3580: 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69  g rollback */.#i
3590: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
35a0: 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69  .  int nHit, nMi
35b0: 73 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ss;            /
35c0: 2a 20 43 61 63 68 65 20 68 69 74 73 20 61 6e 64  * Cache hits and
35d0: 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e   missing */.  in
35e0: 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b  t nRead, nWrite;
35f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
3600: 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61 64  abase pages read
3610: 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64  /written */.#end
3620: 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73  if.  void (*xDes
3630: 74 72 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a  tructor)(DbPage*
3640: 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74  ,int); /* Call t
3650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e  his routine when
3660: 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a   freeing pages *
3670: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e  /.  void (*xRein
3680: 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e  iter)(DbPage*,in
3690: 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68  t);   /* Call th
36a0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
36b0: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
36c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
36d0: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
36e0: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
36f0: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3700: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3710: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3720: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3730: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3740: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3750: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3760: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  () */.#endif.  i
3770: 6e 74 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20  nt nHash;       
3780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
3790: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
37a0: 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20  hash table */.  
37b0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20  PgHdr **aHash;  
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
37d0: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70  ash table to map
37e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
37f0: 50 67 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20  PgHdr */.#ifdef 
3800: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3810: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
3820: 20 20 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20    Pager *pNext; 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3840: 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   Linked list of 
3850: 70 61 67 65 72 73 20 69 6e 20 74 68 69 73 20 74  pagers in this t
3860: 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a  hread */.#endif.
3870: 20 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63    char *pTmpSpac
3880: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3890: 20 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20   Pager.pageSize 
38a0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
38b0: 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20  or tmp use */.  
38c0: 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b  char dbFileVers[
38d0: 31 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  16];        /* C
38e0: 68 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20  hanges whenever 
38f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
3900: 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  anges */.};../*.
3910: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
3920: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
3930: 73 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20  s hold counters 
3940: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
3950: 69 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c  ing purposes onl
3960: 79 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62  y.  These variab
3970: 6c 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74  les do not exist
3980: 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73   in.** a non-tes
3990: 74 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65  ting build.  The
39a0: 73 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  se variables are
39b0: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
39c0: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
39d0: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
39e0: 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
39f0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f  _count = 0;    /
3a00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  * Number of full
3a10: 20 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d   pages read from
3a20: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a30: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
3a40: 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a  _count = 0;   /*
3a50: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3a60: 70 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f  pages written to
3a70: 20 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   DB */.int sqlit
3a80: 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
3a90: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3aa0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
3ab0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
3ac0: 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nal */.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65   Number of cache
3b00: 20 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a   pages freed */.
3b10: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
3b20: 4e 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73  NCR(v)  v++.#els
3b30: 65 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52  e.# define PAGER
3b40: 5f 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a  _INCR(v).#endif.
3b50: 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c  .../*.** Journal
3b60: 20 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74   files begin wit
3b70: 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
3b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54  magic string.  T
3b90: 68 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f  he data.** was o
3ba0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65  btained from /de
3bb0: 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73  v/random.  It is
3bc0: 20 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20   used only as a 
3bd0: 73 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a  sanity check..**
3be0: 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f  .** Since versio
3bf0: 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75  n 2.8.0, the jou
3c00: 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74  rnal format cont
3c10: 61 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20  ains additional 
3c20: 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69  sanity.** checki
3c30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20  ng information. 
3c40: 20 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61   If the power fa
3c50: 69 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  ils while the jo
3c60: 75 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a  urnal is begin.*
3c70: 2a 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d  * written, semi-
3c80: 72 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64  random garbage d
3c90: 61 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72  ata might appear
3ca0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
3cb0: 2a 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f  ** file after po
3cc0: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e  wer is restored.
3cd0: 20 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20    If an attempt 
3ce0: 69 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20  is then made.** 
3cf0: 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72  to roll the jour
3d00: 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61  nal back, the da
3d10: 74 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20  tabase could be 
3d20: 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20  corrupted.  The 
3d30: 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61  additional.** sa
3d40: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61  nity checking da
3d50: 74 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  ta is an attempt
3d60: 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65   to discover the
3d70: 20 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a   garbage in the.
3d80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69  ** journal and i
3d90: 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  gnore it..**.** 
3da0: 54 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b  The sanity check
3db0: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3dc0: 66 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72  for the new jour
3dd0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69  nal format consi
3de0: 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62  sts.** of a 32-b
3df0: 69 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65  it checksum on e
3e00: 61 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61  ach page of data
3e10: 2e 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20  .  The checksum 
3e20: 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74  covers both.** t
3e30: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
3e40: 6e 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70  nd the pPager->p
3e50: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
3e60: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   data for the pa
3e70: 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75  ge..** This cksu
3e80: 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  m is initialized
3e90: 20 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e   to a 32-bit ran
3ea0: 64 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61  dom value that a
3eb0: 70 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a  ppears in the.**
3ec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69   journal file ri
3ed0: 67 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65  ght after the he
3ee0: 61 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f  ader.  The rando
3ef0: 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73  m initializer is
3f00: 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62   important,.** b
3f10: 65 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64  ecause garbage d
3f20: 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
3f30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61   at the end of a
3f40: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65   journal is like
3f50: 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20  ly.** data that 
3f60: 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65  was once in othe
3f70: 72 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76  r files that hav
3f80: 65 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74  e now been delet
3f90: 65 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67  ed.  If the.** g
3fa0: 61 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65  arbage data came
3fb0: 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74   from an obsolet
3fc0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
3fd0: 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69  the checksums mi
3fe0: 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63  ght.** be correc
3ff0: 74 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69  t.  But by initi
4000: 61 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63  alizing the chec
4010: 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76  ksum to random v
4020: 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73  alue which.** is
4030: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65   different for e
4040: 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65  very journal, we
4050: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72   minimize that r
4060: 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  isk..*/.static c
4070: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4080: 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ar aJournalMagic
4090: 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30  [] = {.  0xd9, 0
40a0: 78 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c  xd5, 0x05, 0xf9,
40b0: 20 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36   0x20, 0xa1, 0x6
40c0: 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a  3, 0xd7,.};../*.
40d0: 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  ** The size of t
40e0: 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66  he header and of
40f0: 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68   each page in th
4100: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74  e journal is det
4110: 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68  ermined.** by th
4120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72  e following macr
4130: 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  os..*/.#define J
4140: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
4150: 67 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e  ger)  ((pPager->
4160: 70 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a  pageSize) + 8)..
4170: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
4180: 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f  l header size fo
4190: 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e  r this pager. In
41a0: 20 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69   the future, thi
41b0: 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65  s could be.** se
41c0: 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20  t to some value 
41d0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69  read from the di
41e0: 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54  sk controller. T
41f0: 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20  he important.** 
4200: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69  characteristic i
4210: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
4220: 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20   same size as a 
4230: 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a  disk sector..*/.
4240: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
4250: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28  HDR_SZ(pPager) (
4260: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
4270: 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  ze)../*.** The m
4280: 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72  acro MEMDB is tr
4290: 75 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61  ue if we are dea
42a0: 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d  ling with an in-
42b0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
42c0: 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61  .** We do this a
42d0: 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61  s a macro so tha
42e0: 74 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f  t if the SQLITE_
42f0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61  OMIT_MEMORYDB ma
4300: 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74  cro is set,.** t
4310: 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44  he value of MEMD
4320: 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73  B will be a cons
4330: 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d  tant and the com
4340: 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d  piler will optim
4350: 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20  ize.** out code 
4360: 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72  that would never
4370: 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66   execute..*/.#if
4380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4390: 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e  MEMORYDB.# defin
43a0: 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a  e MEMDB 0.#else.
43b0: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70  # define MEMDB p
43c0: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e  Pager->memDb.#en
43d0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  dif../*.** Page 
43e0: 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f  number PAGER_MJ_
43f0: 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73  PGNO is never us
4400: 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  ed in an SQLite 
4410: 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a  database (it is.
4420: 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  ** reserved for 
4430: 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61  working around a
4440: 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69   windows/posix i
4450: 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e  ncompatibility).
4460: 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69   It is.** used i
4470: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  n the journal to
4480: 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68   signify that th
4490: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
44a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
44b0: 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74  .** is devoted t
44c0: 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74  o storing a mast
44d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
44e0: 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  - there are no m
44f0: 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20  ore pages to.** 
4500: 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63  roll back. See c
4510: 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63  omments for func
4520: 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72  tion writeMaster
4530: 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65  Journal() for de
4540: 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65  tails..*/./* #de
4550: 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47  fine PAGER_MJ_PG
4560: 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42  NO(x) (PENDING_B
4570: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
4580: 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ze)) */.#define 
4590: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
45a0: 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f   ((PENDING_BYTE/
45b0: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
45c0: 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d  +1)../*.** The m
45d0: 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67  aximum legal pag
45e0: 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33  e number is (2^3
45f0: 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69  1 - 1)..*/.#defi
4600: 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  ne PAGER_MAX_PGN
4610: 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a  O 2147483647../*
4620: 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72  .** Enable refer
4630: 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b  ence count track
4640: 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69  ing (for debuggi
4650: 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66  ng) here:.*/.#if
4660: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
4670: 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65  .  int pager3_re
4680: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30  finfo_enable = 0
4690: 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  ;.  static void 
46a0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67  pager_refinfo(Pg
46b0: 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61  Hdr *p){.    sta
46c0: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
46d0: 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33  .    if( !pager3
46e0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
46f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71  ) return;.    sq
4700: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4710: 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54  (.       "REFCNT
4720: 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52  : %4d addr=%p nR
4730: 65 66 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64  ef=%-3d total=%d
4740: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70  \n",.       p->p
4750: 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
4760: 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20  TA(p), p->nRef, 
4770: 70 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a  p->pPager->nRef.
4780: 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b      );.    cnt++
4790: 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67  ;   /* Something
47a0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
47b0: 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23  oint on */.  }.#
47c0: 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28   define REFINFO(
47d0: 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66  X)  pager_refinf
47e0: 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  o(X).#else.# def
47f0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23  ine REFINFO(X).#
4800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
4810: 75 72 6e 20 74 72 75 65 20 69 66 20 70 61 67 65  urn true if page
4820: 20 2a 70 50 67 20 68 61 73 20 61 6c 72 65 61 64   *pPg has alread
4830: 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
4840: 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  o the statement.
4850: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73  ** journal (or s
4860: 74 61 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f  tatement snapsho
4870: 74 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  t has been creat
4880: 65 64 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70  ed, if *pPg is p
4890: 61 72 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d  art.** of an in-
48a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29  memory database)
48b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48c0: 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
48d0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
48e0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
48f0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
4900: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72  ( MEMDB ){.    r
4910: 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48  eturn PGHDR_TO_H
4920: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
4930: 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  ->inStmt;.  }els
4940: 65 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  e{.    Pgno pgno
4950: 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
4960: 20 20 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72    u8 *a = pPager
4970: 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72  ->aInStmt;.    r
4980: 65 74 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74  eturn (a && (int
4990: 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
49a0: 74 6d 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67  tmtSize && (a[pg
49b0: 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
49c0: 6f 26 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a  o&7))));.  }.}..
49d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
49e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
49f0: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  er hash table to
4a00: 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61   N.  N must be a
4a10: 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f   power.** of two
4a20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4a30: 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
4a40: 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a  sh_table(Pager *
4a50: 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a  pPager, int N){.
4a60: 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c    PgHdr **aHash,
4a70: 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28   *pPg;.  assert(
4a80: 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29   N>0 && (N&(N-1)
4a90: 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20  )==0 );.  aHash 
4aa0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4ab0: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
4ac0: 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73  *N );.  if( aHas
4ad0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
4ae0: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
4af0: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
4b00: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
4b10: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
4b20: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
4b30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
4b40: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
4b50: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  .  pPager->nHash
4b60: 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = N;.  pPager->
4b70: 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20  aHash = aHash;. 
4b80: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
4b90: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
4ba0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
4bb0: 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69      int h;.    i
4bc0: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
4bd0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4be0: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
4bf0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
4c00: 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
4c10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
4c20: 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67  .    h = pPg->pg
4c30: 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20  no & (N-1);.    
4c40: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
4c50: 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69   aHash[h];.    i
4c60: 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  f( aHash[h] ){. 
4c70: 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70       aHash[h]->p
4c80: 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
4c90: 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b      }.    aHash[
4ca0: 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  h] = pPg;.    pP
4cb0: 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
4cc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4cd0: 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ead a 32-bit int
4ce0: 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69  eger from the gi
4cf0: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4d00: 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20  tor.  Store the 
4d10: 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20  integer.** that 
4d20: 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73  is read in *pRes
4d30: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4d40: 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
4d50: 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a  g worked, or an.
4d60: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
4d70: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
4d80: 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  wrong..**.** All
4d90: 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72   values are stor
4da0: 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69  ed on disk as bi
4db0: 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61  g-endian..*/.sta
4dc0: 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69  tic int read32bi
4dd0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
4de0: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
4df0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4e00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
4e10: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
4e20: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a  c, sizeof(ac));.
4e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
4e50: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4e60: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4e70: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4e80: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
4e90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4ea0: 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  te a 32-bit inte
4eb0: 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69 6e  ger into a strin
4ec0: 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67 2d  g buffer in big-
4ed0: 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64 65  endian byte orde
4ee0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4ef0: 64 20 70 75 74 33 32 62 69 74 73 28 63 68 61 72  d put32bits(char
4f00: 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *ac, u32 val){.
4f10: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4f20: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4f30: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4f40: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4f50: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4f60: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4f70: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4f80: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4f90: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4fa0: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4fb0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4fc0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4fd0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4fe0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4ff0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5000: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5010: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5020: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5030: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5040: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5050: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5060: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5070: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5080: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5090: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
50a0: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
50b0: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
50c0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
50d0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
50e0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
50f0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
5100: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
5110: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5120: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
5130: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
5140: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
5150: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
5160: 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c  rn (ac[0]<<24) |
5170: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
5180: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
5190: 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ];.}.../*.** Thi
51a0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
51b0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
51c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
51d0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
51e0: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
51f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
5200: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5210: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
5220: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
5230: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
5240: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
5250: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
5260: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
5270: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
5280: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
5290: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52a0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
52b0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
52c0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
52d0: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
52e0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
52f0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
5300: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
5310: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
5320: 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73 65  stent. All subse
5330: 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73 20  quent API calls 
5340: 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a 2a  on this Pager.**
5350: 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   will immediatel
5360: 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d  y return the sam
5370: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
5380: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
5390: 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70  r_error(Pager *p
53a0: 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a  Pager, int rc){.
53b0: 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26    int rc2 = rc &
53c0: 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28   0xff;.  assert(
53d0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
53e0: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c  ==SQLITE_FULL ||
53f0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
5400: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
5410: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
5420: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
5430: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
5440: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
5450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
5460: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
5470: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
5480: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5490: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
54a0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
54b0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
54c0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
54d0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
54e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
54f0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
5500: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
5510: 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  u32 hash = 0;.  
5520: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
5530: 64 20 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20  d char *pData = 
5540: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
5550: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
5560: 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Page);.  for(i=0
5570: 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65  ; i<pPage->pPage
5580: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b  r->pageSize; i++
5590: 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68  ){.    hash = (h
55a0: 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b  ash+i)^pData[i];
55b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
55c0: 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  sh;.}../*.** The
55d0: 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72   CHECK_PAGE macr
55e0: 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a  o takes a PgHdr*
55f0: 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e   as an argument.
5600: 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b   If SQLITE_CHECK
5610: 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66  _PAGES.** is def
5620: 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47  ined, and NDEBUG
5630: 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c   is not defined,
5640: 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   an assert() sta
5650: 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a  tement checks.**
5660: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
5670: 73 20 65 69 74 68 65 72 20 64 69 72 74 79 20 6f  s either dirty o
5680: 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20  r still matches 
5690: 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70  the calculated p
56a0: 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65  age-hash..*/.#de
56b0: 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28  fine CHECK_PAGE(
56c0: 78 29 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a  x) checkPage(x).
56d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
56e0: 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
56f0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
5700: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
5710: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67  ;.  assert( !pPg
5720: 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50  ->pageHash || pP
5730: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
5740: 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64   MEMDB || pPg->d
5750: 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70  irty || .      p
5760: 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61  Pg->pageHash==pa
5770: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
5780: 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64  ) );.}..#else.#d
5790: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
57a0: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
57b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
57c0: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
57d0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
57e0: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
57f0: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
5800: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5810: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
5820: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
5830: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
5840: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
5850: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
5860: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
5870: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
5880: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
5890: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
58a0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
58b0: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
58c0: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
58d0: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
58e0: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
58f0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
5900: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
5910: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
5920: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
5930: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
5940: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5950: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
5960: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
5970: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
5980: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
5990: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
59a0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
59b0: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
59c0: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
59d0: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
59e0: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
59f0: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
5a00: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
5a10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
5a20: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
5a30: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
5a40: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
5a50: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
5a60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5a70: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
5a80: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
5a90: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5aa0: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
5ab0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5ac0: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
5ad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5ae0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5af0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5b00: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
5b10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5b20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5b30: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5b40: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
5b50: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
5b60: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
5b70: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5b80: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
5b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5bb0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
5bc0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
5bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
5be0: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
5bf0: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
5c00: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
5c10: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
5c20: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
5c30: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5c40: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
5c50: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
5c60: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
5c70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5c80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
5c90: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
5ca0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
5cb0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
5cc0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
5cd0: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
5ce0: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
5cf0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
5d00: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
5d10: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
5d20: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
5d30: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
5d40: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
5d50: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
5d60: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
5d70: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
5d80: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
5d90: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
5da0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
5db0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5dc0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
5dd0: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
5de0: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
5df0: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
5e00: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
5e10: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
5e20: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
5e30: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
5e40: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
5e50: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
5e60: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
5e70: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
5e80: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
5e90: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
5ea0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5eb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5ed0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5ee0: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5ef0: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5f00: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5f10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5f20: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5f30: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5f40: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
5f50: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
5f60: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
5f70: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
5f80: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
5f90: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
5fa0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5fb0: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5fc0: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5ff0: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
6000: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
6010: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
6020: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
6030: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
6040: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6050: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
6060: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
6070: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
6080: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
60b0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
60c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
60d0: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
60e0: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
60f0: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
6100: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
6110: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6120: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
6130: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
6140: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6150: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
6160: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
6170: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
6180: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
6190: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
61a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
61b0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
61c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
61d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
61e0: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
61f0: 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  lOff);.}../*.** 
6200: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
6210: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
6220: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6230: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6240: 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28  rnal.** header (
6250: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6260: 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e  ytes) is written
6270: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
6280: 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a  l file at the.**
6290: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
62a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  n..**.** The for
62b0: 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  mat for the jour
62c0: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73  nal header is as
62d0: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38   follows:.** - 8
62e0: 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64   bytes: Magic id
62f0: 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61  entifying journa
6300: 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34  l format..** - 4
6310: 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f   bytes: Number o
6320: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75  f records in jou
6330: 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73  rnal, or -1 no-s
6340: 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a  ync mode is on..
6350: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61  ** - 4 bytes: Ra
6360: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64  ndom number used
6370: 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a   for page hash..
6380: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e  ** - 4 bytes: In
6390: 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70  itial database p
63a0: 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20  age count..** - 
63b0: 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20  4 bytes: Sector 
63c0: 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65  size used by the
63d0: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72   process that wr
63e0: 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ote this journal
63f0: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
6400: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
6410: 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73  R_SZ - 24) bytes
6420: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
6430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6440: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6460: 20 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73    char zHeader[s
6470: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6480: 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20  gic)+16];.  int 
6490: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
64a0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30  r->stmtHdrOff==0
64b0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
64c0: 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61  stmtHdrOff = pPa
64d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
64e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65  .  }..  rc = see
64f0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6500: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6510: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
6530: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6540: 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
6550: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58  ager);..  /* FIX
6580: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
6590: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
65a0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
65b0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
65c0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
65d0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
65e0: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
65f0: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
6600: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
6610: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
6620: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
6630: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
6640: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6650: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
6660: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
6670: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
6680: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
6690: 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65  .  memcpy(zHeade
66a0: 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  r, aJournalMagic
66b0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
66c0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54  lMagic));.  /* T
66d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
66e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
66f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
6700: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
6710: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6720: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
6730: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f  pPager->noSync ?
6740: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 29   0xffffffff : 0)
6750: 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f  ;.  /* The rando
6760: 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69  m check-hash ini
6770: 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73  tialiser */ .  s
6780: 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73  qlite3Randomness
6790: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
67a0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
67b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
67c0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
67d0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
67e0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
67f0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6800: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
6810: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
6820: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
6830: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6840: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
6850: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
6860: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
6870: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
6880: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
6890: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
68a0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
68b0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
68c0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
68d0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f  ectorSize);.  IO
68e0: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
68f0: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
6900: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
6910: 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  nalHdr, sizeof(z
6920: 48 65 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d  Header))).  rc =
6930: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6940: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
6950: 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  ader, sizeof(zHe
6960: 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68  ader));..  /* Th
6970: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6980: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
6990: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
69a0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
69b0: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
69c0: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
69d0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
69e0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
69f0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
6a00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49  LITE_OK ){.    I
6a10: 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25  OTRACE(("JTAIL %
6a20: 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65  p %lld\n", pPage
6a30: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
6a40: 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63  alOff-1)).    rc
6a50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6a60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
6a70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6a80: 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  -1);.    if( rc=
6a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6aa0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6ab0: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
6ac0: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b  jfd, "\000", 1);
6ad0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6ae0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6af0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
6b00: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
6b10: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
6b20: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
6b30: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
6b40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6b50: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
6b60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
6b70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
6b80: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
6b90: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
6ba0: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
6bb0: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
6bc0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
6bd0: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
6be0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
6bf0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
6c00: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
6c10: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
6c20: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
6c30: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
6c40: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
6c50: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
6c60: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
6c70: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
6c80: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
6c90: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
6ca0: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
6cb0: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
6cc0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
6cd0: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
6ce0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
6cf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
6d00: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
6d10: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
6d20: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
6d30: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
6d40: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
6d50: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
6d60: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
6d70: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
6d80: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
6d90: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
6da0: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
6db0: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
6dc0: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
6dd0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
6de0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
6df0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
6e00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
6e10: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
6e20: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
6e30: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
6e40: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
6e50: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
6e60: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
6e70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
6e80: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
6e90: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6ea0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6eb0: 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  .  rc = seekJour
6ec0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6ed0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6ee0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  n rc;..  if( pPa
6ef0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
6f00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
6f10: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
6f20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
6f30: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6f40: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
6f50: 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
6f60: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
6f70: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
6f80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6f90: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
6fa0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
6fb0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
6fc0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6fe0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6ff0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7000: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52  pPager->jfd, pNR
7010: 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ec);.  if( rc ) 
7020: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
7030: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
7040: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
7050: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7060: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
7070: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
7080: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
7090: 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a  >jfd, pDbSize);.
70a0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
70b0: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  n rc;..  /* Upda
70c0: 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73  te the assumed s
70d0: 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61  ector-size to ma
70e0: 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73  tch the value us
70f0: 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20  ed by .  ** the 
7100: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65  process that cre
7110: 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61  ated this journa
7120: 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e  l. If this journ
7130: 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61  al was.  ** crea
7140: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
7150: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73   other than this
7160: 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20   one, then this 
7170: 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20  routine.  ** is 
7180: 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f  being called fro
7190: 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70  m within pager_p
71a0: 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c  layback(). The l
71b0: 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ocal value.  ** 
71c0: 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  of Pager.sectorS
71d0: 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  ize is restored 
71e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
71f0: 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f  at routine..  */
7200: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
7210: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
7220: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
7230: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
7240: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7250: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7260: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
7270: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7280: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
7290: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
72a0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
72b0: 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74  urnalOff);.  ret
72c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
72d0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70  * Write the supp
72e0: 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72  lied master jour
72f0: 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68  nal name into th
7300: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
7310: 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67  or pager.** pPag
7320: 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e  er at the curren
7330: 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20  t location. The 
7340: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
7350: 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20  ame must be the 
7360: 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72  last.** thing wr
7370: 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e  itten to a journ
7380: 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
7390: 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c  pager is in full
73a0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a  -sync mode, the.
73b0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
73c0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64  descriptor is ad
73d0: 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65  vanced to the ne
73e0: 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61  xt sector bounda
73f0: 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  ry before.** any
7400: 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e  thing is written
7410: 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a  . The format is:
7420: 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  .**.** + 4 bytes
7430: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
7440: 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c  .** + N bytes: l
7450: 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20  ength of master 
7460: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a  journal name..**
7470: 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a   + 4 bytes: N.**
7480: 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74   + 4 bytes: Mast
7490: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
74a0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38  checksum..** + 8
74b0: 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c   bytes: aJournal
74c0: 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54  Magic[]..**.** T
74d0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
74e0: 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20  l page checksum 
74f0: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
7500: 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  e bytes in the m
7510: 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
7520: 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   name..**.** If 
7530: 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c  zMaster is a NUL
7540: 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72  L pointer (occur
7550: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64  s for a single d
7560: 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
7570: 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63  ion), .** this c
7580: 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
7590: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
75a0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
75b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
75c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
75d0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
75e0: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
75f0: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
7600: 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  m = 0;.  char zB
7610: 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  uf[sizeof(aJourn
7620: 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a  alMagic)+2*4];..
7630: 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c    if( !zMaster |
7640: 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  | pPager->setMas
7650: 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ter) return SQLI
7660: 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d  TE_OK;.  pPager-
7670: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a  >setMaster = 1;.
7680: 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  .  len = strlen(
7690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28  zMaster);.  for(
76a0: 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29  i=0; i<len; i++)
76b0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a  {.    cksum += z
76c0: 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a  Master[i];.  }..
76d0: 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
76e0: 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e  sync mode, advan
76f0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64  ce to the next d
7700: 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72  isk sector befor
7710: 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74  e writing.  ** t
7720: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
7730: 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20  l name. This is 
7740: 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76  in case the prev
7750: 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65  ious page writte
7760: 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f  n to.  ** the jo
7770: 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64  urnal has alread
7780: 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20  y been synced.. 
7790: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
77a0: 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
77b0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
77c0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
77d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
77e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
77f0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
7800: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c  journalOff += (l
7810: 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20  en+20);..  rc = 
7820: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
7830: 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d  er->jfd, PAGER_M
7840: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b  J_PGNO(pPager));
7850: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7860: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7870: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
7880: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7890: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c  >jfd, zMaster, l
78a0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
78b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
78c0: 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69  n rc;..  put32bi
78d0: 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20  ts(zBuf, len);. 
78e0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66   put32bits(&zBuf
78f0: 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d  [4], cksum);.  m
7900: 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20  emcpy(&zBuf[8], 
7910: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
7920: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7930: 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  gic));.  rc = sq
7940: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7950: 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20  ger->jfd, zBuf, 
7960: 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  8+sizeof(aJourna
7970: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67  lMagic));.  pPag
7980: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
7990: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
79a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
79b0: 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d  /*.** Add or rem
79c0: 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ove a page from 
79d0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
79e0: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69  pages that are i
79f0: 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65  n the.** stateme
7a00: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
7a10: 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65 70  * The Pager keep
7a20: 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69 73  s a separate lis
7a30: 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  t of pages that 
7a40: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
7a50: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e  .** the statemen
7a60: 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73  t journal.  This
7a70: 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74   helps the sqlit
7a80: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
7a90: 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72  t().** routine r
7aa0: 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72 20 66  un MUCH faster f
7ab0: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
7ac0: 73 65 20 77 68 65 72 65 20 74 68 65 72 65 20 61  se where there a
7ad0: 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73  re many.** pages
7ae0: 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f   in memory but o
7af0: 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20 69 6e  nly a few are in
7b00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
7b10: 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
7b20: 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f  c void page_add_
7b30: 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48  to_stmt_list(PgH
7b40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
7b50: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
7b60: 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73  >pPager;.  PgHis
7b70: 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
7b80: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
7b90: 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65   pPager);.  asse
7ba0: 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69  rt( MEMDB );.  i
7bb0: 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d  f( !pHist->inStm
7bc0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
7bd0: 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
7be0: 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70  t==0 && pHist->p
7bf0: 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  NextStmt==0 );. 
7c00: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
7c10: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47  Stmt ){.      PG
7c20: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67  HDR_TO_HIST(pPag
7c30: 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  er->pStmt, pPage
7c40: 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  r)->pPrevStmt = 
7c50: 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
7c60: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
7c70: 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  = pPager->pStmt;
7c80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7c90: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48  mt = pPg;.    pH
7ca0: 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  ist->inStmt = 1;
7cb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  .  }.}../*.** Fi
7cc0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
7cd0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
7ce0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
7cf0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
7d00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
7d10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
7d20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
7d30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
7d40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
7d50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
7d60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  ){.  PgHdr *p;. 
7d70: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
7d80: 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  sh==0 ) return 0
7d90: 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e  ;.  p = pPager->
7da0: 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50  aHash[pgno & (pP
7db0: 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b  ager->nHash-1)];
7dc0: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
7dd0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
7de0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
7df0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
7e00: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
7e10: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
7e20: 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  se file..*/.stat
7e30: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
7e40: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
7e50: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
7e60: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
7e70: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
7e80: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
7e90: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
7ea0: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7eb0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
7ec0: 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
7ed0: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e      IOTRACE(("UN
7ee0: 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  LOCK %p\n", pPag
7ef0: 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20 20 70  er)).    }.    p
7f00: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7f10: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
7f20: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
7f30: 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20  ountDone = 0;.  
7f40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  }.}../*.** Execu
7f50: 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 66  te a rollback if
7f60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7f70: 73 20 61 63 74 69 76 65 20 61 6e 64 20 75 6e 6c  s active and unl
7f80: 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ock the .** data
7f90: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
7fa0: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
7fb0: 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72 65  e pager has alre
7fc0: 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a 20 74  ady entered.** t
7fd0: 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65 2e 0a  he error-state..
7fe0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
7ff0: 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c  agerUnlockAndRol
8000: 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 29 7b  lback(Pager *p){
8010: 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43 6f 64  .  if( p->errCod
8020: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  e ) return;.  as
8030: 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d  sert( p->state>=
8040: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
8050: 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  | p->journalOpen
8060: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
8070: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
8080: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
8090: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
80a0: 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  k(p);.  }.  page
80b0: 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61  r_unlock(p);.  a
80c0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
80d0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
80e0: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
80f0: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
8100: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
8110: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
8120: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
8130: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
8140: 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a 2f 2a  veMode );.}.../*
8150: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 69 6e  .** Clear the in
8160: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
8170: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
8180: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
8190: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
81a0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
81b0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
81c0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
81d0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
81e0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
81f0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
8200: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
8210: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
8220: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
8230: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
8240: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
8250: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
8260: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
8270: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
8280: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
8290: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20  ager->errCode ) 
82a0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
82b0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
82c0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
82d0: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50  .    IOTRACE(("P
82e0: 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
82f0: 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
8300: 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49  o));.    PAGER_I
8310: 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
8320: 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b  r_pgfree_count);
8330: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
8340: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
8350: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
8360: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
8370: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Stmt = 0;.  pPag
8380: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
8390: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
83a0: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
83b0: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
83c0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
83d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
83e0: 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Hash = 0;.  sqli
83f0: 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
8400: 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d  Hash);.  pPager-
8410: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
8420: 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b  ager->aHash = 0;
8430: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20  .  pPager->nRef 
8440: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  = 0;.}../*.** Th
8450: 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20  is routine ends 
8460: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
8470: 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  A transaction is
8480: 20 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72   ended by either
8490: 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20  .** a COMMIT or 
84a0: 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  a ROLLBACK..**.*
84b0: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
84c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
84d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
84e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
84f0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
8500: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
8510: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
8520: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
8530: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61  utine will relea
8540: 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  se.** the databa
8550: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
8560: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
8570: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20  ck in its place 
8580: 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68  if that is.** th
8590: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68  e appropriate th
85a0: 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65  ing to do.  Rele
85b0: 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c  ase locks usuall
85c0: 79 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  y is appropriate
85d0: 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61  ,.** unless we a
85e0: 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  re in exclusive 
85f0: 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75  access mode or u
8600: 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20  nless this is a 
8610: 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42  .** COMMIT AND B
8620: 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  EGIN or ROLLBACK
8630: 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61   AND BEGIN opera
8640: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
8650: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
8660: 65 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f  either deleted o
8670: 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a  r truncated..**.
8680: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
8690: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
86a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
86b0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
86c0: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
86d0: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
86e0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
86f0: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
8700: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
8710: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
8720: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
8730: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
8740: 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  t pager_end_tran
8750: 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70  saction(Pager *p
8760: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
8770: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
8780: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
8790: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
87a0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  K;.  assert( !ME
87b0: 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61  MDB );.  if( pPa
87c0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
87d0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
87e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
87f0: 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  K;.  }.  sqlite3
8800: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
8810: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
8820: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
8830: 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  && !pPager->excl
8840: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8850: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
8860: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
8870: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
8880: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
8890: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
88a0: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69  nalOpen ){.    i
88b0: 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  f( pPager->exclu
88c0: 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20 20  siveMode .      
88d0: 20 20 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c      && (rc = sql
88e0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
88f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 29 3d  Pager->jfd, 0))=
8900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b 0a 20  =SQLITE_OK ){;. 
8910: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
8920: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
8930: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  0);.      pPager
8940: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
8950: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8960: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
8970: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8980: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
8990: 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
89a0: 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
89b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
89c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
89d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
89e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
89f0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
8a00: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
8a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
8a20: 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65  qliteFree( pPage
8a30: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b  r->aInJournal );
8a40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
8a50: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8a60: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
8a70: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
8a80: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
8a90: 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
8aa0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
8ab0: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8ac0: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
8ad0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ync = 0;.      p
8ae0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
8af0: 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ck = 0;.#ifdef S
8b00: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
8b10: 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
8b20: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
8b30: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
8b40: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  dif.    }.    pP
8b50: 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
8b60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
8b70: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
8b80: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
8b90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8ba0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8bb0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8bc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8bd0: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
8be0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
8bf0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
8c00: 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
8c10: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
8c20: 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73  e ){.    rc2 = s
8c30: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
8c40: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
8c50: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
8c60: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8c70: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
8c80: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
8c90: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
8ca0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
8cb0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
8cc0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
8cd0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
8ce0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
8cf0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
8d00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
8d10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
8d20: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8d30: 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
8d40: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  t;.  pPager->dbS
8d50: 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74  ize = -1;..  ret
8d60: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
8d70: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
8d80: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
8d90: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
8da0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
8db0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
8dc0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
8dd0: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
8de0: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
8df0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
8e00: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
8e10: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
8e20: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
8e30: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
8e40: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
8e50: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
8e60: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
8e70: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
8e80: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
8e90: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8ea0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
8eb0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8ec0: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
8ed0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
8ee0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
8ef0: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
8f00: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
8f10: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
8f20: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
8f30: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
8f40: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
8f50: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
8f60: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
8f70: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
8f80: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
8f90: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
8fa0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
8fb0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
8fc0: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
8fd0: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
8fe0: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
8ff0: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
9000: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
9010: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
9020: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
9030: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
9040: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
9050: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
9060: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
9070: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
9080: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
9090: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
90a0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
90b0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
90c0: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
90d0: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
90e0: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
90f0: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
9100: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
9110: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
9120: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
9130: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
9140: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
9150: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
9160: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
9170: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
9180: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
9190: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
91a0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
91b0: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
91c0: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
91d0: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
91e0: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
91f0: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
9200: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
9210: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
9220: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
9230: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
9240: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
9250: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
9260: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
9270: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
9280: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
9290: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
92a0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
92b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
92c0: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
92d0: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
92e0: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
92f0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
9300: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
9310: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
9320: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
9330: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
9340: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
9350: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
9360: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
9370: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
9380: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
9390: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
93a0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
93b0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
93c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
93d0: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
93e0: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
93f0: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
9400: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
9410: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9430: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
9440: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
9450: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9470: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
9480: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
9490: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
94a0: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
94b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
94c0: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
94d0: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
94e0: 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61  g */.  u8 *aData
94f0: 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
9500: 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a  >pTmpSpace;   /*
9510: 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f   Temp storage fo
9520: 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f  r a page */..  /
9530: 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c  * useCksum shoul
9540: 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74 68  d be true for th
9550: 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
9560: 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a  nd false for.  *
9570: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
9580: 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68  nals.  Verify th
9590: 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61 79  at this is alway
95a0: 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a  s the case.  */.
95b0: 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d    assert( jfd ==
95c0: 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61   (useCksum ? pPa
95d0: 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65  ger->jfd : pPage
95e0: 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73  r->stfd) );.  as
95f0: 73 65 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a  sert( aData );..
9600: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
9610: 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20  s(jfd, &pgno);. 
9620: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
9630: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
9640: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9650: 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c  Read(jfd, aData,
9660: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9670: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
9680: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
9690: 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   rc;.  pPager->j
96a0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61  ournalOff += pPa
96b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  ger->pageSize + 
96c0: 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  4;..  /* Sanity 
96d0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20  checking on the 
96e0: 70 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d  page.  This is m
96f0: 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ore important th
9700: 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a  at I originally.
9710: 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49    ** thought.  I
9720: 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  f a power failur
9730: 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74  e occurs while t
9740: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
9750: 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a  ing written,.  *
9760: 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65  * it could cause
9770: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f   invalid data to
9780: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
9790: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57   the journal.  W
97a0: 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64  e need to.  ** d
97b0: 65 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c  etect this inval
97c0: 69 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69  id data (with hi
97d0: 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20  gh probability) 
97e0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20  and ignore it.. 
97f0: 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   */.  if( pgno==
9800: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
9810: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
9820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9830: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
9840: 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69    if( pgno>(unsi
9850: 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
9860: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
9870: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
9880: 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20  .  if( useCksum 
9890: 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  ){.    rc = read
98a0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73  32bits(jfd, &cks
98b0: 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  um);.    if( rc 
98c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
98d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
98e0: 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66  Off += 4;.    if
98f0: 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  ( pager_cksum(pP
9900: 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b  ager, aData)!=ck
9910: 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  sum ){.      ret
9920: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
9930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
9940: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
9950: 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
9960: 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  VED || pPager->s
9970: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9980: 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  USIVE );..  /* I
9990: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
99a0: 6e 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  n RESERVED state
99b0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
99c0: 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74  t be a copy of t
99d0: 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  his.  ** page in
99e0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
99f0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a  . In this case j
9a00: 75 73 74 20 75 70 64 61 74 65 20 74 68 65 20 70  ust update the p
9a10: 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a  ager cache,.  **
9a20: 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
9a30: 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  e file. The page
9a40: 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20   is left marked 
9a50: 64 69 72 74 79 20 69 6e 20 74 68 69 73 20 63 61  dirty in this ca
9a60: 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  se..  **.  ** If
9a70: 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74   in EXCLUSIVE st
9a80: 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64  ate, then we upd
9a90: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
9aa0: 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73  che if it exists
9ab0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61  .  ** and the ma
9ac0: 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67  in file. The pag
9ad0: 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64  e is then marked
9ae0: 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a   not dirty..  **
9af0: 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31  .  ** Ticket #11
9b00: 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65  71:  The stateme
9b10: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  nt journal might
9b20: 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f   contain page co
9b30: 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20  ntent that is.  
9b40: 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  ** different fro
9b50: 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  m the page conte
9b60: 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nt at the start 
9b70: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
9b80: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63  on..  ** This oc
9b90: 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65  curs when a page
9ba0: 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f   is changed prio
9bb0: 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
9bc0: 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  f a statement.  
9bd0: 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20  ** then changed 
9be0: 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65  again within the
9bf0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65   statement.  Whe
9c00: 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73  n rolling back s
9c10: 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65  uch a.  ** state
9c20: 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74  ment we must not
9c30: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72   write to the or
9c40: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
9c50: 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20  unless we know. 
9c60: 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20   ** for certain 
9c70: 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61  that original pa
9c80: 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20  ge contents are 
9c90: 69 6e 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  in the main roll
9ca0: 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  back.  ** journa
9cb0: 6c 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69  l.  Otherwise, i
9cc0: 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  f a full ROLLBAC
9cd0: 4b 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 74  K occurs after t
9ce0: 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  he statement.  *
9cf0: 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66  * rollback the f
9d00: 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c  ull ROLLBACK wil
9d10: 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68  l not restore th
9d20: 65 20 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72  e page to its or
9d30: 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74  iginal.  ** cont
9d40: 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74  ent.  Two condit
9d50: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74  ions must be met
9d60: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
9d70: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
9d80: 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20    ** files. (1) 
9d90: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
9da0: 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32  t be locked.  (2
9db0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
9dc0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
9dd0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
9de0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75   in the main jou
9df0: 72 6e 61 6c 20 65 69 74 68 65 72 20 62 65 63 61  rnal either beca
9e00: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 73 20  use the page is 
9e10: 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68  not in.  ** cach
9e20: 65 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20  e or else it is 
9e30: 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79  marked as needSy
9e40: 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50  nc==0..  */.  pP
9e50: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
9e60: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
9e70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
9e80: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9e90: 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21  XCLUSIVE || pPg!
9ea0: 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
9eb0: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
9ec0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
9ed0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9ee0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9ef0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9f00: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9f10: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9f20: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9f30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
9f40: 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
9f50: 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
9f60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9f70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
9f80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9f90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9fa0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
9fb0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
9fc0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9fd0: 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20      if( pPg ){. 
9fe0: 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
9ff0: 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Pg);.    }.  }. 
a000: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
a010: 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c  /* No page shoul
a020: 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63  d ever be explic
a030: 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b  itly rolled back
a040: 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c   that is in use,
a050: 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
a060: 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20  or page 1 which 
a070: 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69  is held in use i
a080: 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20  n order to keep 
a090: 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  the lock on the.
a0a0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a0b0: 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20  active. However 
a0c0: 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20  such a page may 
a0d0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61  be rolled back a
a0e0: 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  s a result.    *
a0f0: 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c  * of an internal
a100: 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67   error resulting
a110: 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   in an automatic
a120: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
a130: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
a140: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
a150: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
a160: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
a170: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
a180: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
a190: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
a1a0: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a1b0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
a1c0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
a1d0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a1e0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
a1f0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
a200: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a210: 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e  er(pPg, pPager->
a220: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
a230: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a240: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a250: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a260: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a270: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
a280: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
a290: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
a2a0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
a2b0: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
a2c0: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
a2d0: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
a2e0: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
a2f0: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
a300: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
a310: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
a320: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
a330: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
a340: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
a350: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
a360: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
a370: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
a380: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
a390: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
a3a0: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20  >pgno, 3);.  }. 
a3b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a3c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
a3d0: 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61  Master is the na
a3e0: 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
a3f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73  ournal file. A s
a400: 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ingle journal.**
a410: 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72   file that refer
a420: 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65  red to the maste
a430: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  r journal file h
a440: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c  as just been rol
a450: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  led back..** Thi
a460: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
a470: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
a480: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
a490: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a4a0: 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65  file,.** and doe
a4b0: 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a  s so if it is..*
a4c0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e  journal file con
a4e0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
a4f0: 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75  of all child jou
a500: 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c  rnals..** To tel
a510: 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  l if a master jo
a520: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
a530: 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65  eted, check to e
a540: 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ach of the.** ch
a550: 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20  ildren.  If all 
a560: 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74  children are eit
a570: 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64  her missing or d
a580: 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a  o not refer to.*
a590: 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61  * a different ma
a5a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68  ster journal, th
a5b0: 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a  en this master j
a5c0: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a5d0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
a5e0: 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61   int pager_delma
a5f0: 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  ster(const char 
a600: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
a610: 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65   rc;.  int maste
a620: 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73  r_open = 0;.  Os
a630: 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30  File *master = 0
a640: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
a650: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
a660: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
a670: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a680: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
a690: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
a6a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
a6b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
a6c0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
a6d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a6e0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
a6f0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
a700: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
a710: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
a720: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
a730: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
a740: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
a750: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ence..  */.  rc 
a760: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a770: 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c  eadOnly(zMaster,
a780: 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73   &master);.  ass
a790: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a7a0: 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a  OK || master );.
a7b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a7c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a7d0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74  ster_out;.  mast
a7e0: 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72  er_open = 1;.  r
a7f0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
a800: 65 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e  eSize(master, &n
a810: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a820: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a830: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
a840: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
a850: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
a860: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
a870: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
a880: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
a890: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
a8a0: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
a8b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
a8c0: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
a8d0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
a8e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
a8f0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
a900: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
a910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
a920: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
a930: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
a940: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
a950: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
a960: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
a970: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a980: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
a990: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
a9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
a9b0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61  sqlite3OsRead(ma
a9c0: 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75  ster, zMasterJou
a9d0: 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75  rnal, nMasterJou
a9e0: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  rnal);.    if( r
a9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
aa00: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
aa10: 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c  t;..    zJournal
aa20: 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61   = zMasterJourna
aa30: 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a  l;.    while( (z
aa40: 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a  Journal-zMasterJ
aa50: 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a  ournal)<nMasterJ
aa60: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
aa70: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
aa80: 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c  eExists(zJournal
aa90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
aaa0: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
aab0: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
aac0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
aad0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
aae0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
aaf0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
ab00: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
ab10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
ab20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
ab30: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
ab40: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
ab50: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
ab60: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
ab70: 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72      OsFile *jour
ab80: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
ab90: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
aba0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
abb0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
abc0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
abd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
abe0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
abf0: 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  | journal );.   
ac00: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ac10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ac20: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ac30: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ac40: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
ac50: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
ac60: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
ac70: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
ac80: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
ac90: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
aca0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
acb0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
acc0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
acd0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ace0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
acf0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
ad00: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
ad10: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
ad20: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
ad30: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
ad40: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
ad60: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
ad70: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
ad80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
ad90: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
ada0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
adb0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
adc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
add0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
ade0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
adf0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63     }.  }.  .  rc
ae00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
ae10: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
ae20: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
ae30: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
ae40: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
ae50: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
ae60: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
ae70: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
ae80: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ae90: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
aea0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
aeb0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  ..static void pa
aec0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
aed0: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
aee0: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  );../*.** Trunca
aef0: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
af00: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
af10: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
af20: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
af30: 64 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72  dicated. Also tr
af40: 75 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65  uncate the cache
af50: 64 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  d representation
af60: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f   of the file..*/
af70: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
af80: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
af90: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50   *pPager, int nP
afa0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
afb0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
afc0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
afd0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
afe0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
aff0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
b000: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
b010: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
b020: 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69  )nPage);.  }.  i
b030: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
b040: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b050: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
b060: 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
b070: 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
b080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
b090: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
b0a0: 74 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66  the sectorSize f
b0b0: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
b0c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  er..**.** The se
b0d0: 63 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65  ctor size is the
b0e0: 20 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73   larger of the s
b0f0: 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72  ector size repor
b100: 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
b110: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20  3OsSectorSize() 
b120: 61 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65  and the pageSize
b130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b140: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
b150: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b160: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b170: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
b180: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
b190: 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61  ->fd);.  if( pPa
b1a0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c  ger->sectorSize<
b1b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b1c0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
b1d0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61  sectorSize = pPa
b1e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
b1f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79   }.}../*.** Play
b200: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
b210: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
b220: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
b230: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
b240: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
b250: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
b260: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
b270: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
b280: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
b290: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
b2a0: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
b2b0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
b2c0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
b2d0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
b2e0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
b2f0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
b300: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
b310: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
b320: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
b330: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
b340: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
b350: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
b360: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
b370: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
b380: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
b390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
b3a0: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
b3b0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
b3c0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b3d0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
b3e0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
b3f0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
b400: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
b410: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b420: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b430: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
b440: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
b450: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
b460: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
b470: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
b480: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b490: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
b4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
b4b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
b4c0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
b4d0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
b4e0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
b4f0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b500: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
b510: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
b520: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
b530: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b540: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
b550: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
b560: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
b570: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
b580: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
b590: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
b5a0: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
b5b0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
b5c0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
b5d0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
b5e0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
b5f0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
b600: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
b610: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
b620: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
b630: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
b640: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
b650: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
b660: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
b670: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
b680: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
b690: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
b6a0: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
b6b0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
b6c0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
b6d0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
b6e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
b6f0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
b700: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
b710: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
b720: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
b730: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
b740: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
b750: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
b760: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
b770: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
b780: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
b790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
b7a0: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
b7b0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
b7c0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
b7d0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
b7e0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
b7f0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
b800: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
b810: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
b820: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
b830: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
b840: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
b850: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
b860: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
b870: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
b880: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
b890: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b8a0: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
b8b0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
b8c0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
b8d0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
b8e0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
b8f0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
b900: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
b910: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
b920: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
b930: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
b940: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
b950: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
b960: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
b970: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
b980: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
b990: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
b9a0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b9b0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
b9c0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
b9d0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
b9e0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
b9f0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
ba00: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
ba10: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
ba20: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
ba30: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
ba40: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
ba50: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
ba60: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
ba70: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
ba80: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
ba90: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
baa0: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
bab0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
bac0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
bad0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
bae0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
baf0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
bb00: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
bb10: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
bb20: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
bb30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
bb40: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
bb50: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
bb60: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
bb70: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
bb80: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
bb90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bba0: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
bbb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
bbc0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
bbd0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
bbe0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
bbf0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
bc00: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
bc10: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
bc20: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
bc30: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
bc40: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
bc50: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
bc60: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
bc70: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
bc80: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
bc90: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
bca0: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
bcb0: 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
bcc0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bce0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bcf0: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
bd00: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
bd30: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
bd40: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
bd70: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
bd80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
bd90: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
bda0: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
bdb0: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
bdc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bdd0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
bde0: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
bdf0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
be00: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
be10: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
be20: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
be30: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
be40: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
be50: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
be60: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
be70: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
be80: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
be90: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
bea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
beb0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
bec0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bed0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
bee0: 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  >jfd, &szJ);.  i
bef0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bf00: 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20   || szJ==0 ){.  
bf10: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
bf20: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
bf30: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
bf40: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
bf50: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
bf60: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
bf70: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
bf80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
bf90: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
bfa0: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
bfb0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
bfc0: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
bfd0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
bfe0: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
bff0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
c000: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
c010: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
c020: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  dMasterJournal(p
c030: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
c040: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
c050: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c060: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c070: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
c080: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
c090: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
c0a0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
c0b0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
c0c0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
c0d0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
c0e0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
c0f0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c100: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c110: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
c120: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
c130: 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65  jfd, 0);.  pPage
c140: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
c150: 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
c160: 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
c170: 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
c180: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
c190: 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
c1a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
c1b0: 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
c1c0: 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
c1d0: 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
c1e0: 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
c1f0: 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
c200: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
c210: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
c220: 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
c230: 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
c240: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c250: 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
c260: 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
c270: 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
c280: 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
c290: 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
c2a0: 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
c2b0: 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
c2c0: 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
c2d0: 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
c2e0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
c2f0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
c300: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
c310: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
c320: 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
c330: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c340: 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
c350: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
c360: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c370: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
c380: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c390: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
c3a0: 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
c3b0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
c3c0: 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
c3d0: 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
c3e0: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
c3f0: 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
c400: 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
c410: 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
c420: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c430: 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
c440: 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
c450: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
c460: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c470: 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
c480: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
c490: 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
c4a0: 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
c4b0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c4c0: 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
c4d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c4e0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c4f0: 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
c500: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
c510: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
c520: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
c530: 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
c540: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c560: 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
c570: 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
c580: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
c590: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
c5a0: 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e  .    ** process.
c5b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
c5c0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c5d0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69  urnal file consi
c5e0: 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f  sts of.    ** jo
c5f0: 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20  urnalled copies 
c600: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  of pages that ne
c610: 65 64 20 74 6f 20 62 65 20 72 65 61 64 20 62 61  ed to be read ba
c620: 63 6b 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ck into the cach
c630: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c640: 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73  ( nRec==0 && !is
c650: 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Hot ){.      nRe
c660: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
c670: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
c680: 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
c690: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c6a0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c6b0: 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
c6c0: 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
c6d0: 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
c6e0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
c6f0: 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
c700: 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c  to it's original
c710: 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
c720: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
c730: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c740: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c750: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
c760: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c770: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
c780: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
c790: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
c7a0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c7b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
c7c0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c7d0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c7e0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c7f0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c800: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c810: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c820: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c830: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c840: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c850: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c860: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c870: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c890: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c8a0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c8b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c8c0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c8d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c8e0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c8f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c900: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c910: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c920: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c930: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c940: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
c950: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
c960: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
c970: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c980: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c990: 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
c9a0: 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
c9b0: 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20  }.  if( zMaster 
c9c0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
c9d0: 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
c9e0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
c9f0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
ca00: 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
ca10: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
ca20: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
ca30: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
ca40: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
ca50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ca60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
ca70: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
ca80: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
ca90: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
caa0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
cab0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
cac0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
cad0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
cae0: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
caf0: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
cb00: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
cb10: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
cb20: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
cb30: 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
cb40: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
cb50: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
cb60: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
cb70: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
cb80: 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
cb90: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
cba0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
cbb0: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
cbc0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
cbd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
cbe0: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
cbf0: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
cc00: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
cc10: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
cc20: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
cc30: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
cc40: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
cc50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
cc60: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
cc70: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
cc80: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
cc90: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
cca0: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
ccb0: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
ccc0: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
ccd0: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
cce0: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
ccf0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
cd00: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
cd10: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
cd20: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
cd30: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
cd40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
cd50: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
cd60: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
cd70: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
cd80: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
cd90: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
cda0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
cdb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
cdc0: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
cdd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cde0: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
cdf0: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
ce00: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce20: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
ce30: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
ce40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce50: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ce60: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
ce70: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
ce80: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
ce90: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
cea0: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
ceb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
cec0: 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
ced0: 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a  >jfd, &os_szJ);.
cee0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
cef0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
cf00: 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  c;.    assert( s
cf10: 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20  zJ==os_szJ );.  
cf20: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53  }.#endif..  /* S
cf30: 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20  et hdrOff to be 
cf40: 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20  the offset just 
cf50: 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
cf60: 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61   the last journa
cf70: 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74  l.  ** page writ
cf80: 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66  ten before the f
cf90: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  irst journal-hea
cfa0: 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61  der for this sta
cfb0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e  tement.  ** tran
cfc0: 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74  saction was writ
cfd0: 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20  ten, or the end 
cfe0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e  of the file if n
cff0: 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68  o journal.  ** h
d000: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
d010: 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66  n..  */.  hdrOff
d020: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48   = pPager->stmtH
d030: 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28  drOff;.  assert(
d040: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
d050: 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a  c || !hdrOff );.
d060: 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b    if( !hdrOff ){
d070: 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a  .    hdrOff = sz
d080: 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54  J;.  }.  .  /* T
d090: 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74 61  runcate the data
d0a0: 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73  base back to its
d0b0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
d0c0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
d0d0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
d0e0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
d0f0: 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ize);.  assert( 
d100: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d110: 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
d120: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
d130: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
d140: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
d150: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
d160: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
d170: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d180: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
d190: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
d1a0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
d1b0: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
d1c0: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
d1d0: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
d1e0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
d1f0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
d200: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
d210: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
d220: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
d230: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
d240: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
d250: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
d260: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
d270: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
d280: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
d290: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
d2a0: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
d2b0: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
d2c0: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
d2d0: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
d2e0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
d2f0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d300: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d310: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30   pPager->stfd, 0
d320: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
d330: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d340: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d350: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
d360: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d370: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
d380: 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20  roll some pages 
d390: 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72  back from the tr
d3a0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
d3b0: 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69  l. Pager.stmtJSi
d3c0: 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20  ze.  ** was the 
d3d0: 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
d3e0: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68  nal file when th
d3f0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  is statement was
d400: 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a   started, so.  *
d410: 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66 74  * everything aft
d420: 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  er that needs to
d430: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c   be rolled back,
d440: 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
d450: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
d460: 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65  the memory cache
d470: 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a  , or both..  **.
d480: 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f    ** If it is no
d490: 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67  t zero, then Pag
d4a0: 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73  er.stmtHdrOff is
d4b0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
d4c0: 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
d4d0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
d4e0: 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65  al header writte
d4f0: 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73 74  n during this st
d500: 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
d510: 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ion..  */.  rc =
d520: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
d530: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
d540: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a  er->stmtJSize);.
d550: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d560: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
d570: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d580: 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
d590: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
d5a0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
d5b0: 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
d5c0: 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
d5d0: 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
d5e0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d5f0: 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
d600: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d610: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d620: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d630: 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20  r->jfd, 1);.    
d640: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d650: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
d660: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d670: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
d680: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
d690: 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d    while( pPager-
d6a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
d6b0: 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52  J ){.    u32 nJR
d6c0: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ec;         /* N
d6d0: 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c  umber of Journal
d6e0: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20   Records */.    
d6f0: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
d700: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
d710: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
d720: 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b  &nJRec, &dummy);
d730: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
d740: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d750: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
d760: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
d770: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
d780: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
d790: 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20     if( nJRec==0 
d7a0: 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d  ){.      nJRec =
d7b0: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
d7c0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
d7d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
d7e0: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
d7f0: 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d  r(i=nJRec-1; i>=
d800: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d810: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d820: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d830: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d840: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d850: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d860: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d870: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d880: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d890: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d8a0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d8b0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d8c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d8d0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d8e0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d8f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
d900: 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67  E_OK) {.    pPag
d910: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d920: 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67   szJ;.    /* pag
d930: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
d940: 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a  pPager); */.  }.
d950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d960: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
d970: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
d980: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
d990: 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
d9a0: 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
d9b0: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
d9c0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
d9d0: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
d9e0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31  {.  if( mxPage>1
d9f0: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
da00: 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65  >mxPage = mxPage
da10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
da20: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
da30: 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  10;.  }.}../*.**
da40: 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
da50: 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
da60: 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
da70: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
da80: 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
da90: 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
daa0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
dab0: 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
dac0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
dad0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
dae0: 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
daf0: 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
db00: 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
db10: 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
db20: 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
db30: 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
db40: 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
db50: 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
db60: 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
db70: 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
db80: 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
db90: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
dba0: 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
dbb0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dbc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dbd0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
dbe0: 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
dbf0: 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
dc00: 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
dc10: 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
dc20: 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
dc30: 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
dc40: 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
dc50: 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
dc60: 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
dc70: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
dc80: 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
dc90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
dca0: 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
dcb0: 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
dcc0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
dcd0: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
dce0: 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
dcf0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
dd00: 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
dd10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
dd20: 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
dd30: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dd40: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dd50: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
dd60: 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
dd70: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
dd80: 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
dd90: 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
dda0: 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
ddb0: 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
ddc0: 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
ddd0: 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
ddf0: 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
de00: 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
de10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
de20: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
de30: 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
de40: 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
de50: 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
de60: 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
de70: 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
de80: 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
de90: 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
dea0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
deb0: 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
dec0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
ded0: 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
dee0: 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
def0: 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
df00: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
df10: 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
df20: 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
df30: 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
df40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
df50: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
df60: 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
df70: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
df80: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
df90: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
dfa0: 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20  t full_fsync){. 
dfb0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
dfc0: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
dfd0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
dfe0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
dff0: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
e000: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
e010: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  ile;.  pPager->f
e020: 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c  ull_fsync = full
e030: 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50  _fsync;.  if( pP
e040: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
e050: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
e060: 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  = 0;.}.#endif../
e070: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
e080: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
e090: 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  le is incremente
e0a0: 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c  d whenever the l
e0b0: 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70  ibrary.** attemp
e0c0: 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  ts to open a tem
e0d0: 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68  porary file.  Th
e0e0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
e0f0: 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
e100: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
e110: 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69  is only.  .*/.#i
e120: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e130: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
e140: 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b  ntemp_count = 0;
e150: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
e160: 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20  pen a temporary 
e170: 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69  file. .**.** Wri
e180: 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  te the file desc
e190: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
e1a0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
e1b0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
e1c0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
e1d0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
e1e0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
e1f0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
e200: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
e210: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
e220: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
e230: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
e240: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
e250: 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20  Opentemp(OsFile 
e260: 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e  **pFd){.  int cn
e270: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
e280: 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51  .  char zFile[SQ
e290: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
e2a0: 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ZE];..#ifdef SQL
e2b0: 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
e2c0: 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
e2d0: 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f  t++;  /* Used fo
e2e0: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  r testing and an
e2f0: 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23  alysis only */.#
e300: 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20  endif.  do{.    
e310: 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74  cnt--;.    sqlit
e320: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
e330: 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20  (zFile);.    rc 
e340: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45  = sqlite3OsOpenE
e350: 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20  xclusive(zFile, 
e360: 70 46 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  pFd, 1);.    ass
e370: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
e380: 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20  OK || *pFd );.  
e390: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
e3a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
e3b0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
e3c0: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
e3d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
e3e0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
e3f0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
e400: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
e410: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
e420: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
e430: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
e440: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
e450: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
e460: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
e470: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
e480: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
e490: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
e4a0: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
e4b0: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
e4c0: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
e4d0: 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
e4e0: 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
e4f0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
e500: 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
e510: 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
e520: 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
e530: 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
e540: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
e550: 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
e560: 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
e570: 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
e580: 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
e590: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
e5a0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
e5b0: 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
e5c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
e5d0: 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
e5e0: 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
e5f0: 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
e600: 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
e610: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
e620: 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
e630: 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
e640: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
e650: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
e660: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
e670: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
e680: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
e690: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
e6a0: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
e6b0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
e6c0: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
e6d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
e6e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e6f0: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
e700: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
e710: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
e720: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
e730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
e740: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
e750: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
e760: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
e770: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   0;.  char *zFul
e780: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
e790: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f   int nameLen;  /
e7a0: 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72  * Compiler is wr
e7b0: 6f 6e 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77  ong. This is alw
e7c0: 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ays initialized 
e7d0: 62 65 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20  before use */.  
e7e0: 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a  OsFile *fd = 0;.
e7f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e800: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  E_OK;.  int i;. 
e810: 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20   int tempFile = 
e820: 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d  0;.  int memDb =
e830: 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e   0;.  int readOn
e840: 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73  ly = 0;.  int us
e850: 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67  eJournal = (flag
e860: 73 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  s & PAGER_OMIT_J
e870: 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e  OURNAL)==0;.  in
e880: 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  t noReadlock = (
e890: 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f  flags & PAGER_NO
e8a0: 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20  _READLOCK)!=0;. 
e8b0: 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49   char zTemp[SQLI
e8c0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
e8d0: 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
e8e0: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
e8f0: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
e900: 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
e910: 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
e920: 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
e930: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
e940: 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
e950: 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
e960: 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
e970: 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
e980: 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
e990: 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
e9a0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
e9b0: 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
e9c0: 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
e9d0: 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
e9e0: 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
e9f0: 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
ea00: 62 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64  be set. It would
ea10: 20 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65   be nice to asse
ea20: 72 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72  rt.  ** that Thr
ea30: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69  eadData.nAlloc i
ea40: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20  s non-zero, but 
ea50: 61 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73  alas this breaks
ea60: 20 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a   test cases .  *
ea70: 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76  * written to inv
ea80: 6f 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69  oke the pager di
ea90: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54  rectly..  */.  T
eaa0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
eab0: 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
eac0: 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
ead0: 20 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a   pTsd );.#endif.
eae0: 0a 20 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f  .  /* We used to
eaf0: 20 74 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28   test if malloc(
eb00: 29 20 68 61 64 20 61 6c 72 65 61 64 79 20 66 61  ) had already fa
eb10: 69 6c 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63  iled before proc
eb20: 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75  eeding. .  ** Bu
eb30: 74 20 74 68 65 20 77 61 79 20 74 68 69 73 20 66  t the way this f
eb40: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
eb50: 69 6e 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20  in SQLite means 
eb60: 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20  that can never. 
eb70: 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74   ** happen. Furt
eb80: 68 65 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20  hermore, if the 
eb90: 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
eba0: 61 67 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  ag is already se
ebb0: 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20  t, .  ** either 
ebc0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
ebd0: 74 65 53 74 72 44 75 70 28 29 20 6f 72 20 73 71  teStrDup() or sq
ebe0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c  liteMalloc() bel
ebf0: 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69  ow will.  ** fai
ec00: 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51  l shortly and SQ
ec10: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72  LITE_NOMEM retur
ec20: 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f  ned anyway..  */
ec30: 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b  .  *ppPager = 0;
ec40: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
ec50: 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73  pager file and s
ec60: 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  et zFullPathname
ec70: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c   to point at mal
ec80: 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65  loc()ed .  ** me
ec90: 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  mory containing 
eca0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c  the complete fil
ecb0: 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c  ename (i.e. incl
ecc0: 75 64 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  uding the direct
ecd0: 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ory)..  */.  if(
ece0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46   zFilename && zF
ecf0: 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69  ilename[0] ){.#i
ed00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ed10: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
ed20: 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
ed30: 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
ed40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
ed50: 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75  b = 1;.      zFu
ed60: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
ed70: 69 74 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20  iteStrDup("");. 
ed80: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
ed90: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
eda0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
edb0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
edc0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
edd0: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
ede0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
edf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ee00: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
ee10: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
ee20: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
ee30: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
ee40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64  =SQLITE_OK || fd
ee50: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
ee60: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
ee70: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee80: 4f 70 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20  Opentemp(&fd);. 
ee90: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
eea0: 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b  FileName(zTemp);
eeb0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
eec0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
eed0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
eee0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
eef0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ef00: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ef10: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
ef20: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
ef30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
ef40: 61 74 65 20 74 68 65 20 50 61 67 65 72 20 73 74  ate the Pager st
ef50: 72 75 63 74 75 72 65 2e 20 41 73 20 70 61 72 74  ructure. As part
ef60: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c   of the same all
ef70: 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74  ocation, allocat
ef80: 65 0a 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72  e.  ** space for
ef90: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20   the full paths 
efa0: 6f 66 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72  of the file, dir
efb0: 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e  ectory and journ
efc0: 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e  al .  ** (Pager.
efd0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72  zFilename, Pager
efe0: 2e 7a 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20  .zDirectory and 
eff0: 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e  Pager.zJournal).
f000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c  .  */.  if( zFul
f010: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
f020: 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65   nameLen = strle
f030: 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  n(zFullPathname)
f040: 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
f050: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f060: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
f070: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
f080: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 20  .    if( pPager 
f090: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
f0a0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f0b0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63  ->pTmpSpace = (c
f0c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
f0d0: 6f 63 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46  ocRaw(SQLITE_DEF
f0e0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b  AULT_PAGE_SIZE);
f0f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
f100: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
f110: 63 75 72 65 64 20 69 6e 20 65 69 74 68 65 72 20  cured in either 
f120: 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62  of the blocks ab
f130: 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65  ove, free the me
f140: 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74  mory .  ** point
f150: 65 64 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61  ed to by zFullPa
f160: 74 68 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65  thname, free the
f170: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
f180: 20 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a   and close the .
f190: 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65    ** file. Since
f1a0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f   the pager is no
f1b0: 74 20 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72  t allocated ther
f1c0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
f1d0: 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61  set .  ** any Pa
f1e0: 67 65 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69  ger.errMask vari
f1f0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  ables..  */.  if
f200: 28 20 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46  ( !pPager || !zF
f210: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21  ullPathname || !
f220: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
f230: 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f  e || rc!=SQLITE_
f240: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
f250: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
f260: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
f270: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f280: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
f290: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
f2a0: 20 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ((rc==SQLITE_OK
f2b0: 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72  )?SQLITE_NOMEM:r
f2c0: 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  c);.  }..  PAGER
f2d0: 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20  TRACE3("OPEN %d 
f2e0: 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c  %s\n", FILEHANDL
f2f0: 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61  EID(fd), zFullPa
f300: 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41  thname);.  IOTRA
f310: 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
f320: 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c  n", pPager, zFul
f330: 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50  lPathname)).  pP
f340: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  ager->zFilename 
f350: 3d 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72  = (char*)&pPager
f360: 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  [1];.  pPager->z
f370: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61  Directory = &pPa
f380: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e  ger->zFilename[n
f390: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61  ameLen+1];.  pPa
f3a0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20  ger->zJournal = 
f3b0: 26 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  &pPager->zDirect
f3c0: 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ory[nameLen+1];.
f3d0: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
f3e0: 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c  >zFilename, zFul
f3f0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
f400: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  rcpy(pPager->zDi
f410: 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61  rectory, zFullPa
f420: 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 66 6f 72 28  thname);..  for(
f430: 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
f440: 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
f450: 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
f460: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
f470: 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
f480: 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
f490: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
f4a0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
f4b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c  Pathname);.  sql
f4c0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
f4d0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
f4e0: 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
f4f0: 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a  al[nameLen], "-j
f500: 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67  ournal");.  pPag
f510: 65 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f  er->fd = fd;.  /
f520: 2a 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  * pPager->journa
f530: 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  lOpen = 0; */.  
f540: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
f550: 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20  al = useJournal 
f560: 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61  && !memDb;.  pPa
f570: 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
f580: 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20  = noReadlock && 
f590: 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70  readOnly;.  /* p
f5a0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
f5b0: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f5c0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
f5d0: 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
f5e0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f  er->nRef = 0; */
f5f0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
f600: 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70  e = memDb-1;.  p
f610: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
f620: 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
f630: 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a  _PAGE_SIZE;.  /*
f640: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
f650: 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  e = 0; */.  /* p
f660: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
f670: 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
f680: 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  ager->nPage = 0;
f690: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f6a0: 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 20 2a  >nMaxPage = 0; *
f6b0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
f6c0: 67 65 20 3d 20 31 30 30 3b 0a 20 20 61 73 73 65  ge = 100;.  asse
f6d0: 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rt( PAGER_UNLOCK
f6e0: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ==0 );.  /* pPag
f6f0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
f700: 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
f710: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
f720: 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
f730: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
f740: 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
f750: 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
f760: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
f770: 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
f780: 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
f790: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f7a0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
f7b0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
f7c0: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
f7d0: 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
f7e0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
f7f0: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
f800: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
f810: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f820: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
f830: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f840: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
f850: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
f860: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
f870: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
f880: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
f890: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
f8a0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
f8b0: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
f8c0: 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
f8d0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
f8e0: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
f8f0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
f900: 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
f910: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
f920: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
f930: 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
f940: 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69  (fd||memDb);.  i
f950: 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
f960: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
f970: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
f980: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f990: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
f9a0: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
f9b0: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
f9c0: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
f9d0: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
f9e0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
f9f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
fa00: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
fa10: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
fa20: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
fa30: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
fa40: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
fa50: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
fa60: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fa70: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
fa80: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
fa90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
faa0: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
fab0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
fac0: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
fad0: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
fae0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
faf0: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
fb00: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
fb10: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
fb20: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fb30: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
fb40: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
fb50: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
fb60: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
fb70: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
fb80: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
fb90: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
fba0: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
fbb0: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
fbc0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
fbd0: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
fbe0: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
fbf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
fc00: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
fc10: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
fc20: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fc30: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
fc40: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
fc50: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
fc60: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f  PagerUnref()..*/
fc70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
fc80: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
fc90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
fca0: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50  oid (*xDesc)(DbP
fcb0: 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
fcc0: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
fcd0: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
fce0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
fcf0: 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
fd00: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
fd10: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
fd20: 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
fd30: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
fd40: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
fd50: 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
fd60: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
fd70: 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
fd80: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
fd90: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
fda0: 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
fdb0: 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
fdc0: 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
fdd0: 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
fde0: 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
fdf0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
fe00: 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
fe10: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
fe20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fe30: 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
fe40: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fe50: 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c  Reinit)(DbPage*,
fe60: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
fe70: 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
fe80: 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
fe90: 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
fea0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
feb0: 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20  w size.  If the 
fec0: 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
fed0: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70  .** size is inap
fee0: 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
fef0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
ff00: 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65  age size is sele
ff10: 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75  cted.** and retu
ff20: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
ff30: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
ff40: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
ff50: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
ff60: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
ff70: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
ff80: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
ff90: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
ffa0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
ffb0: 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e  emDb && pPager->
ffc0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nRef==0 ){.    p
ffd0: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
ffe0: 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
fff0: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
10000 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
10010 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
10020 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  ite3ReallocOrFre
10030 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
10040 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ace, pageSize);.
10050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
10060 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
10070 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
10080 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
10090 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
100a0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
100b0 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
100c0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
100d0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
100e0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
100f0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
10100 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
10110 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
10120 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
10130 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
10140 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
10150 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
10160 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
10170 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
10180 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
10190 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
101a0 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
101b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
101c0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
101d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
101e0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
101f0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
10200 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
10210 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10220 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
10230 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
10240 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
10250 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
10260 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
10270 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
10280 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10290 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
102a0 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
102b0 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
102c0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
102d0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
102e0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
102f0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
10300 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10310 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
10320 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
10330 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
10340 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
10350 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
10360 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
10370 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
10380 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
10390 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
103a0 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
103b0 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
103c0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
103d0 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
103e0 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
103f0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
10400 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
10410 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
10420 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
10430 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
10440 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
10450 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
10460 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
10470 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
10480 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
10490 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
104a0 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
104b0 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
104c0 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
104d0 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
104e0 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
104f0 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e  out this)..*/.in
10500 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
10510 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
10520 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10530 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
10540 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
10550 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10560 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
10570 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d  0, N);.  if( MEM
10580 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64 69 73  DB==0 ){.    dis
10590 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
105a0 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20  o_errors();.    
105b0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
105c0 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
105d0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
105e0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
105f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42      IOTRACE(("DB
10600 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20  HDR %p 0 %d\n", 
10610 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20  pPager, N)).    
10620 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
10630 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  ad(pPager->fd, p
10640 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66  Dest, N);.    if
10650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
10660 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
10670 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
10680 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
10690 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
106a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
106b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
106c0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
106d0 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
106e0 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
106f0 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  er. .**.** If th
10700 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c  e PENDING_BYTE l
10710 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ies on the page 
10720 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20 74  directly after t
10730 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
10740 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73   file, then cons
10750 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20 70  ider this page p
10760 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  art of the file 
10770 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  too. For example
10780 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f  , if.** PENDING_
10790 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30 39  BYTE is byte 409
107a0 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  6 (the first byt
107b0 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64  e of page 5) and
107c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
107d0 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36  .** file is 4096
107e0 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65 74   bytes, 5 is ret
107f0 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66  urned instead of
10800 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   4..*/.int sqlit
10810 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
10820 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10830 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20  .  i64 n;.  int 
10840 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
10850 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28  ager!=0 );.  if(
10860 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
10870 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
10880 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
10890 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
108a0 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
108b0 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
108c0 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72 63 20  e {.    if( (rc 
108d0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
108e0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
108f0 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  &n))!=SQLITE_OK 
10900 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
10910 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
10920 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
10930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10940 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d  n>0 && n<pPager-
10950 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
10960 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65     n = 1;.    }e
10970 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20  lse{.      n /= 
10980 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
109a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
109b0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
109c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
109d0 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20  ize = n;.    }. 
109e0 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e   }.  if( n==(PEN
109f0 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72  DING_BYTE/pPager
10a00 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20  ->pageSize) ){. 
10a10 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65     n++;.  }.  re
10a20 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e  turn n;.}...#ifn
10a30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10a40 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
10a50 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
10a60 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
10a70 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
10a80 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
10a90 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
10aa0 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
10ab0 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
10ac0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
10ad0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
10ae0 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
10af0 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
10b00 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
10b10 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
10b20 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
10b30 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
10b40 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
10b50 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
10b60 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
10b70 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
10b80 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
10b90 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
10ba0 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
10bb0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
10bc0 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
10bd0 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
10be0 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
10bf0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
10c00 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
10c10 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  e() routine can 
10c20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20  leave a page in 
10c30 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65  the .** pNextFre
10c40 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74  e/pPrevFree list
10c50 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70   that is not a p
10c60 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d  art of any hash-
10c70 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10c80 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68   void unlinkHash
10c90 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Chain(Pager *pPa
10ca0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29  ger, PgHdr *pPg)
10cb0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e  {.  if( pPg->pgn
10cc0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  o==0 ){.    asse
10cd0 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
10ce0 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50  sh==0 && pPg->pP
10cf0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
10d00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
10d10 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
10d20 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  sh ){.    pPg->p
10d30 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
10d40 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
10d50 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10d60 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29  pPg->pPrevHash )
10d70 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
10d80 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d  ager->aHash[pPg-
10d90 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d  >pgno & (pPager-
10da0 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20  >nHash-1)]!=pPg 
10db0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  );.    pPg->pPre
10dc0 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68  vHash->pNextHash
10dd0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
10de0 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  h;.  }else{.    
10df0 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e  int h = pPg->pgn
10e00 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
10e10 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65  sh-1);.    pPage
10e20 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
10e30 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10e40 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
10e50 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72  .    clearHistor
10e60 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
10e70 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
10e80 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d   }.  pPg->pgno =
10e90 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
10ea0 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10eb0 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
10ec0 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
10ed0 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
10ee0 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
10ef0 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
10f00 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
10f10 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
10f20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
10f30 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10f40 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
10f50 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
10f60 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
10f70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
10f80 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
10f90 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
10fa0 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
10fb0 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
10fc0 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
10fd0 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
10fe0 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
10ff0 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
11000 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
11010 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
11020 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
11030 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
11040 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11050 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
11060 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
11070 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
11080 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
11090 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
110a0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
110b0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
110c0 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
110d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
110e0 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
110f0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
11100 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
11110 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
11120 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
11130 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
11140 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
11150 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
11160 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
11170 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11180 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
11190 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
111a0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
111b0 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
111c0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
111d0 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
111e0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
111f0 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
11200 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
11210 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
11220 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pPg);.}../*.** 
11230 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
11240 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65  used to truncate
11250 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
11260 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  a database.** is
11270 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f   truncated.  Dro
11280 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65  p from the cache
11290 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65   all pages whose
112a0 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67   pgno is.** larg
112b0 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
112c0 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
112d0 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a  referenced..**.*
112e0 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67  * Referenced pag
112f0 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  es larger than p
11300 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72  Pager->dbSize ar
11310 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
11320 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65  Actually, at the
11330 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
11340 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ine is called, i
11350 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e  t would be.** an
11360 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61   error to have a
11370 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
11380 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68  .  But rather th
11390 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61  an delete.** tha
113a0 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61  t page and guara
113b0 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e  ntee a subsequen
113c0 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73  t segfault, it s
113d0 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74  eems better.** t
113e0 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f  o zero it and ho
113f0 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72  pe that we error
11400 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a   out sanely..*/.
11410 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11420 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
11430 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
11440 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
11450 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
11460 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
11470 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
11480 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
11490 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
114a0 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
114b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
114c0 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
114d0 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
114e0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
114f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
11500 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
11510 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
11520 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
11530 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
11540 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
11550 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11570 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
11580 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54  xtAll;.      IOT
11590 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
115a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
115b0 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
115c0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
115d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72  lite3_pager_pgfr
115e0 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  ee_count);.     
115f0 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
11600 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ;.      makeClea
11610 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71  n(pPg);.      sq
11620 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
11630 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
11640 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ge--;.    }.  }.
11650 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
11660 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
11670 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
11680 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
11690 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
116a0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
116b0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
116c0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20  epeat until the 
116d0 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65  busy callback re
116e0 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f  turns.** false o
116f0 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b  r until the lock
11700 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a   succeeds..**.**
11710 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
11720 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
11730 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
11740 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61  f we cannot obta
11750 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a  in.** the lock..
11760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11770 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
11780 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11790 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
117a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
117b0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
117c0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
117d0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
117e0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
117f0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
11800 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
11810 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
11820 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
11830 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
11840 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
11850 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
11860 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
11870 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
11880 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
11890 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
118a0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
118b0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
118c0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
118d0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
118e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30  pPager->dbSize<0
118f0 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20   || MEMDB );..  
11900 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
11910 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
11920 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11930 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
11940 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  do {.      rc = 
11950 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
11960 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
11970 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
11980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
11990 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
119a0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
119b0 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
119c0 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
119d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
119e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
119f0 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
11a00 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c       IOTRACE(("L
11a10 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OCK %p %d\n", pP
11a20 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29  ager, locktype))
11a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11a40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11a50 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
11a60 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
11a70 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
11a80 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
11a90 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
11aa0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
11ab0 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
11ac0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
11ad0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11ae0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
11af0 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74  MEMDB );.  sqlit
11b00 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
11b10 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
11b20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
11b30 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67  ){.    rc = pPag
11b40 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
11b50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11b60 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
11b70 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
11b80 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
11b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11ba0 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
11bb0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
11bc0 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
11bd0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
11be0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
11bf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11c00 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  E_OK;.  }.  rc =
11c10 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
11c20 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
11c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
11c50 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63  .  /* Get an exc
11c60 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74  lusive lock on t
11c70 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
11c80 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a  re truncating. *
11c90 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
11ca0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
11cb0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
11cc0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
11cd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11ce0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
11cf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
11d00 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50  ncate(pPager, nP
11d10 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
11d20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
11d30 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
11d40 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
11d50 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
11d60 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
11d70 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
11d80 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
11d90 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
11da0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
11db0 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
11dc0 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
11dd0 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
11de0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
11df0 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
11e00 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
11e10 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
11e20 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
11e30 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
11e40 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
11e50 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
11e60 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
11e70 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
11e80 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
11e90 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  edump..**.** Thi
11ea0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
11eb0 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61  s succeeds. If a
11ec0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11ed0 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70  active an attemp
11ee0 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20  t.** is made to 
11ef0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66  roll it back. If
11f00 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11f10 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c   during the roll
11f20 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a  back .** a hot j
11f30 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65  ournal may be le
11f40 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79  ft in the filesy
11f50 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f  stem but no erro
11f60 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  r is returned.**
11f70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11f80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
11f90 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a  gerClose(Pager *
11fa0 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20  pPager){.#ifdef 
11fb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
11fc0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
11fd0 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20    /* A malloc() 
11fe0 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73  cannot fail in s
11ff0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
12000 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  () as one or mor
12010 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a  e calls to .  **
12020 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68   malloc() must h
12030 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
12040 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68   made by this th
12050 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67  read before it g
12060 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73  ets.  ** to this
12070 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61   point. This mea
12080 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74  ns the ThreadDat
12090 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  a must have been
120a0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61   allocated alrea
120b0 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  dy.  ** so that 
120c0 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
120d0 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20  c can be set..  
120e0 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20  */.  ThreadData 
120f0 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54  *pTsd = sqlite3T
12100 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61  hreadData();.  a
12110 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b  ssert( pPager );
12120 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
12130 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20  && pTsd->nAlloc 
12140 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73  );.#endif..  dis
12150 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
12160 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50  o_errors();.  pP
12170 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
12180 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63  0;.  pPager->exc
12190 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a  lusiveMode = 0;.
121a0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
121b0 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e  ager);.  pagerUn
121c0 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
121d0 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c  pPager);.  enabl
121e0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
121f0 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52  rrors();.  PAGER
12200 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
12210 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
12220 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45  ger));.  IOTRACE
12230 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20  (("CLOSE %p\n", 
12240 70 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72  pPager)).  asser
12250 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
12260 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  de || (pPager->j
12270 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26  ournalOpen==0 &&
12280 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
12290 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
122a0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
122b0 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
122c0 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
122d0 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  ->jfd);.  }.  sq
122e0 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
122f0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
12300 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
12310 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
12320 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
12330 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20  er->stfd);.  }. 
12340 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
12350 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  &pPager->fd);.  
12360 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
12370 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
12380 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
12390 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
123a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
123b0 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
123c0 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
123d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
123e0 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  .  */..#ifdef SQ
123f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
12400 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
12410 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61  /* Remove the pa
12420 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e  ger from the lin
12430 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
12440 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a  rs starting at .
12450 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e    ** ThreadData.
12460 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79  pPager if memory
12470 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
12480 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  nabled..  */.  i
12490 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d  f( pPager==pTsd-
124a0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70  >pPager ){.    p
124b0 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50  Tsd->pPager = pP
124c0 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
124d0 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20  else{.    Pager 
124e0 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70  *pTmp;.    for(p
124f0 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67  Tmp = pTsd->pPag
12500 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21  er; pTmp->pNext!
12510 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54  =pPager; pTmp=pT
12520 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20  mp->pNext){}.   
12530 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70   pTmp->pNext = p
12540 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
12550 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
12560 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48  eFree(pPager->aH
12570 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ash);.  sqliteFr
12580 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  ee(pPager->pTmpS
12590 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  pace);.  sqliteF
125a0 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
125b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
125c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
125d0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
125e0 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
125f0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
12600 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
12610 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
12620 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
12630 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
12640 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
12650 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
12660 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
12670 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
12680 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
12690 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
126a0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
126b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
126c0 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
126d0 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
126e0 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
126f0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
12700 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
12710 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
12720 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
12730 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
12740 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
12750 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
12760 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
12770 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
12780 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
12790 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
127a0 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
127b0 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
127c0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
127d0 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
127e0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
127f0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12800 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
12810 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
12820 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
12830 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
12840 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
12850 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
12860 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
12870 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
12880 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
12890 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
128a0 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
128b0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
128c0 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
128d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
128e0 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
128f0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
12900 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
12910 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
12920 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
12930 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
12940 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
12950 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
12960 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12970 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12980 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
12990 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
129a0 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
129b0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
129c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
129d0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
129e0 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
129f0 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
12a00 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
12a10 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
12a20 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
12a30 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
12a40 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
12a50 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
12a60 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
12a70 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
12a80 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
12a90 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
12aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12ab0 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
12ac0 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
12ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
12ae0 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
12af0 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
12b00 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
12b10 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
12b20 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
12b30 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
12b40 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
12b50 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
12b60 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
12b70 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
12b80 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
12b90 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
12ba0 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50 61  te3PagerRef(DbPa
12bb0 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67 65  ge *pPg){.  page
12bc0 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74  _ref(pPg);.  ret
12bd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
12be0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
12bf0 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74   journal.  In ot
12c00 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20  her words, make 
12c10 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67  sure all the pag
12c20 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20  es that have.** 
12c30 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
12c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65  the journal have
12c50 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65   actually reache
12c60 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66  d the surface of
12c70 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49   the.** disk.  I
12c80 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f  t is not safe to
12c90 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67   modify the orig
12ca0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
12cb0 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a  le until after.*
12cc0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
12cd0 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  s been synced.  
12ce0 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
12cf0 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69  database is modi
12d00 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74  fied before.** t
12d10 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  he journal is sy
12d20 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72  nced and a power
12d30 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c   failure occurs,
12d40 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f   the unsynced jo
12d50 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f  urnal.** data wo
12d60 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20  uld be lost and 
12d70 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62  we would be unab
12d80 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  le to completely
12d90 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a   rollback the.**
12da0 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   database change
12db0 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  s.  Database cor
12dc0 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63  ruption would oc
12dd0 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  cur..** .** This
12de0 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70   routine also up
12df0 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66  dates the nRec f
12e00 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64  ield in the head
12e10 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
12e20 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65  l..** (See comme
12e30 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72  nts on the pager
12e40 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74  _playback() rout
12e50 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
12e60 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29  al information.)
12e70 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20  .** If the sync 
12e80 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77  mode is FULL, tw
12e90 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63  o syncs will occ
12ea0 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77  ur.  First the w
12eb0 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  hole journal.** 
12ec0 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20  is synced, then 
12ed0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12ee0 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20  s updated, then 
12ef0 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63  a second sync oc
12f00 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  curs..**.** For 
12f10 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
12f20 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63  ses, we do not c
12f30 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62  are if we are ab
12f40 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a  le to rollback.*
12f50 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20  * after a power 
12f60 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63  failure, so sync
12f70 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
12f80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
12f90 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
12fa0 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
12fb0 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
12fc0 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
12fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
12fe0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
12ff0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
13000 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
13010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
13020 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72  /* Sync the jour
13030 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  nal before modif
13040 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61  ying the main da
13050 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73  tabase.  ** (ass
13060 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61  uming there is a
13070 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20   journal and it 
13080 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
13090 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed.).  */.  if( 
130a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
130b0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
130c0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
130d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
130e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
130f0 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61  en );.      /* a
13100 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
13110 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
13120 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
13130 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
13140 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
13150 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
13160 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
13170 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
13180 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
13190 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
131a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
131b0 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
131c0 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
131d0 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
131e0 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
131f0 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
13200 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
13210 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
13220 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
13230 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
13240 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
13250 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
13260 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
13270 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
13280 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
13290 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
132a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
132b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
132c0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
132d0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
132e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
132f0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
13300 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13310 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
13320 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
13330 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
13340 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
13350 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
13360 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
13370 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
13380 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
13390 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
133a0 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
133b0 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
133c0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
133d0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
133e0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
133f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
13400 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
13410 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
13420 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c  E2("SYNC journal
13430 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52   of %d\n", PAGER
13440 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
13450 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
13460 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
13470 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20  ager)).         
13480 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13490 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
134a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
134b0 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
134c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
134d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
134e0 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
134f0 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20  r->jfd,.        
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13520 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
13530 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
13540 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
13550 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13560 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
13570 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
13580 2c 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  , pPager,.      
13590 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
135a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
135b0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
135c0 4d 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20 20  Magic), 4)).    
135d0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
135e0 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
135f0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
13600 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13610 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
13620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13630 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
13640 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
13650 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
13660 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13670 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
13680 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32       PAGERTRACE2
13690 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
136a0 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
136b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
136c0 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
136d0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
136e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
136f0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
13700 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66  ->jfd, pPager->f
13710 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20 20  ull_fsync);.    
13720 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
13730 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
13740 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
13750 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
13760 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
13770 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
13780 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
13790 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
137a0 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
137b0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
137c0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
137d0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
137e0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
137f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
13800 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
13810 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
13820 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
13830 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
13840 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
13850 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
13860 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
13870 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
13880 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
13890 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
138a0 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
138b0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
138c0 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
138d0 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
138e0 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
138f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
13900 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
13910 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
13920 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
13930 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
13940 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
13950 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13960 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
13970 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
13980 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
13990 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20 74  }../*.** Merge t
139a0 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67 65  wo lists of page
139b0 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  s connected by p
139c0 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67 6e  Dirty and in pgn
139d0 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20 6e  o order..** Do n
139e0 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20 74  ot both fixing t
139f0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
13a00 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  inters..*/.stati
13a10 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f 70  c PgHdr *merge_p
13a20 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
13a30 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a 20  A, PgHdr *pB){. 
13a40 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20 2a   PgHdr result, *
13a50 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20 3d  pTail;.  pTail =
13a60 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69 6c   &result;.  whil
13a70 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a 20  e( pA && pB ){. 
13a80 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f 3c     if( pA->pgno<
13a90 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  pB->pgno ){.    
13aa0 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13ab0 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61 69  = pA;.      pTai
13ac0 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 41  l = pA;.      pA
13ad0 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a 20   = pA->pDirty;. 
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13b00 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c 20  pB;.      pTail 
13b10 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20 3d  = pB;.      pB =
13b20 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20   pB->pDirty;.   
13b30 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 20   }.  }.  if( pA 
13b40 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
13b50 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65 6c  irty = pA;.  }el
13b60 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20 20  se if( pB ){.   
13b70 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13b80 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   pB;.  }else{.  
13b90 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
13ba0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
13bb0 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79 3b  n result.pDirty;
13bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20 74  .}../*.** Sort t
13bd0 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  he list of pages
13be0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
13bf0 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50 61  der by pgno.  Pa
13c00 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e 65  ges are.** conne
13c10 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 70  cted by pDirty p
13c20 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70 50  ointers.  The pP
13c30 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72  revDirty pointer
13c40 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70 74  s are.** corrupt
13c50 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74 2e  ed by this sort.
13c60 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f  .*/.#define N_SO
13c70 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 20  RT_BUCKET_ALLOC 
13c80 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f 52  25.#define N_SOR
13c90 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20 32  T_BUCKET       2
13ca0 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  5.#ifdef SQLITE_
13cb0 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69 74  TEST.  int sqlit
13cc0 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
13cd0 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23 75  bucket = 0;.  #u
13ce0 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  ndef N_SORT_BUCK
13cf0 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f 53  ET.  #define N_S
13d00 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20 20  ORT_BUCKET \.   
13d10 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  (sqlite3_pager_n
13d20 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71 6c  _sort_bucket?sql
13d30 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
13d40 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54 5f  t_bucket:N_SORT_
13d50 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23 65  BUCKET_ALLOC).#e
13d60 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48 64  ndif.static PgHd
13d70 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73 74  r *sort_pagelist
13d80 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20 20  (PgHdr *pIn){.  
13d90 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54 5f  PgHdr *a[N_SORT_
13da0 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20 2a  BUCKET_ALLOC], *
13db0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d 65  p;.  int i;.  me
13dc0 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65 6f  mset(a, 0, sizeo
13dd0 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28 20  f(a));.  while( 
13de0 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  pIn ){.    p = p
13df0 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 2d  In;.    pIn = p-
13e00 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d 3e  >pDirty;.    p->
13e10 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
13e20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52  for(i=0; i<N_SOR
13e30 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b 29  T_BUCKET-1; i++)
13e40 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69 5d  {.      if( a[i]
13e50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
13e60 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  [i] = p;.       
13e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
13e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
13e90 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13ea0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20  a[i], p);.      
13eb0 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20    a[i] = 0;.    
13ec0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13ed0 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b  ( i==N_SORT_BUCK
13ee0 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ET-1 ){.      /*
13ef0 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67 65   Coverage: To ge
13f00 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e 65  t here, there ne
13f10 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53 4f  ed to be 2^(N_SO
13f20 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20 20  RT_BUCKET) .    
13f30 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e    ** elements in
13f40 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74 2e   the input list.
13f50 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62 6c   This is possibl
13f60 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69 63  e, but impractic
13f70 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65 73  al..      ** Tes
13f80 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20 69  ting this line i
13f90 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20 67  s the point of g
13fa0 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a 20  lobal variable. 
13fb0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f       ** sqlite3_
13fc0 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
13fd0 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ket..      */.  
13fe0 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67 65      a[i] = merge
13ff0 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20  _pagelist(a[i], 
14000 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  p);.    }.  }.  
14010 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  p = a[0];.  for(
14020 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=1; i<N_SORT_BU
14030 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  CKET; i++){.    
14040 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
14050 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20 7d  st(p, a[i]);.  }
14060 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
14070 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
14080 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
14090 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
140a0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
140b0 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
140c0 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
140d0 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
140e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
140f0 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
14100 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
14110 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
14120 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
14130 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
14140 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
14150 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
14160 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
14170 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14180 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
14190 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
141a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
141b0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
141c0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
141d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
141e0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
141f0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
14200 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
14210 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
14220 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
14230 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
14240 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
14250 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
14260 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
14270 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
14280 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
14290 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
142a0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
142b0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
142c0 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
142d0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
142e0 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
142f0 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
14300 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
14310 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
14320 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
14330 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
14340 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
14350 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
14360 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
14370 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
14380 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
14390 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
143a0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
143b0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
143c0 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
143d0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
143e0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
143f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
14400 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
14410 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
14420 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
14430 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
14440 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
14450 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
14460 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
14470 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
14480 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
14490 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
144a0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
144b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
144c0 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
144d0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
144e0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
144f0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
14500 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
14510 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
14520 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
14530 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
14540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14550 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
14560 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69  n rc;.  }..  pLi
14570 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69  st = sort_pageli
14580 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68 69  st(pList);.  whi
14590 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
145a0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
145b0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20  dirty );.    rc 
145c0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
145d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69  pPager->fd, (pLi
145e0 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34  st->pgno-1)*(i64
145f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
14600 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
14610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14620 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
14630 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
14640 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
14650 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
14660 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
14670 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
14680 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
14690 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
146a0 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
146b0 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
146c0 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
146d0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
146e0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
146f0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
14700 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
14710 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
14720 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14730 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61  pList->pgno<=pPa
14740 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
14750 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
14760 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
14770 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
14780 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
14790 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 50  gno, 6);.      P
147a0 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4f 52  AGERTRACE3("STOR
147b0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
147c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
147d0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
147e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
147f0 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
14800 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
14810 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
14820 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
14830 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
14840 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
14850 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 50 41 47  Size);.      PAG
14860 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
14870 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
14880 75 6e 74 29 3b 0a 20 20 20 20 20 20 50 41 47 45  unt);.      PAGE
14890 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
148a0 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 69 66  Write);.      if
148b0 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31  ( pList->pgno==1
148c0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
148d0 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
148e0 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32  leVers, &pData[2
148f0 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65  4], sizeof(pPage
14900 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
14910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
14920 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
14930 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41    else{.      PA
14940 47 45 52 54 52 41 43 45 33 28 22 4e 4f 53 54 4f  GERTRACE3("NOSTO
14950 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
14960 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14970 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
14980 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14990 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
149a0 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
149b0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
149c0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
149d0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
149e0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
149f0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
14a00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
14a10 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
14a20 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
14a30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
14a40 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
14a50 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
14a60 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
14a70 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
14a80 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14a90 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
14aa0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
14ab0 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
14ac0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
14ad0 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
14ae0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
14af0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
14b00 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
14b10 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
14b20 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  n pPager->pDirty
14b30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
14b40 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65 20  n TRUE if there 
14b50 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  is a hot journal
14b60 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
14b70 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f  ger..** A hot jo
14b80 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61  urnal is one tha
14b90 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  t needs to be pl
14ba0 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  ayed back..**.**
14bb0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
14bc0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
14bd0 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
14be0 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
14bf0 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
14c00 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
14c10 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
14c20 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
14c30 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
14c40 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
14c50 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65  me.  Just delete
14c60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
14c70 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 48  .static int hasH
14c80 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  otJournal(Pager 
14c90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
14ca0 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
14cb0 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nal ) return 0;.
14cc0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73    if( !sqlite3Os
14cd0 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
14ce0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  r->zJournal) ){.
14cf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14d00 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  }.  if( sqlite3O
14d10 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
14d20 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  ck(pPager->fd) )
14d30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
14d40 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
14d50 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
14d60 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20  pPager)==0 ){.  
14d70 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
14d80 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
14d90 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  al);.    return 
14da0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
14db0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a  return 1;.  }.}.
14dc0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69  ./*.** Try to fi
14dd0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
14de0 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20   cache that can 
14df0 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a  be recycled. .**
14e00 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14e10 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
14e20 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
14e30 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f  _FULL or SQLITE_
14e40 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20  OK. It .** does 
14e50 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67  not set the pPag
14e60 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69  er->errCode vari
14e70 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
14e80 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c  int pager_recycl
14e90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
14ea0 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48   int syncOk, PgH
14eb0 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
14ec0 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
14ed0 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  g = 0;..  assert
14ee0 28 21 4d 45 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20  (!MEMDB);..  /* 
14ef0 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
14f00 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
14f10 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
14f20 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a  at does not.  **
14f30 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
14f40 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
14f50 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  the journal..  *
14f60 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72  /.  pPg = pPager
14f70 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  ->pFirstSynced;.
14f80 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
14f90 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
14fa0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
14fb0 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
14fc0 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
14fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
14fe0 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
14ff0 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
15000 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
15010 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
15020 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
15030 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
15040 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
15050 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
15060 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
15070 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
15080 70 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b  pFirst && syncOk
15090 20 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20   && !MEMDB){.   
150a0 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
150b0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
150c0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
150d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
150e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
150f0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
15100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69  ){.      /* If i
15110 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
15120 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f  , write a new jo
15130 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74  urnal header int
15140 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a  o the.      ** j
15150 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
15160 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f  s is done to avo
15170 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e  id ever modifyin
15180 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  g a journal.    
15190 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
151a0 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
151b0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
151c0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
151d0 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79        ** already
151e0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
151f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
15200 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
15210 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72  r is.      ** tr
15220 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ashed when the n
15230 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64  Rec field is upd
15240 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  ated)..      */.
15250 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
15260 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ec = 0;.      as
15270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
15280 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a  urnalOff > 0 );.
15290 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
152a0 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
152b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
152c0 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
152d0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
152e0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
152f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15310 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
15320 70 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66  pFirst;.  }.  if
15330 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
15340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15350 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
15360 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b   pPg->nRef==0 );
15370 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65  ..  /* Write the
15380 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74   page to the dat
15390 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74  abase file if it
153a0 20 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a   is dirty..  */.
153b0 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
153c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
153d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
153e0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
153f0 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
15400 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72  g);.    pPg->dir
15410 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  ty = 1;.    pPg-
15420 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
15430 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
15440 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20  e_pagelist( pPg 
15450 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
15460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15470 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15480 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
15490 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
154a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
154b0 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
154c0 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
154d0 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
154e0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
154f0 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
15500 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
15510 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
15520 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  he.  ** sqlite3P
15530 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
15540 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
15550 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
15560 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
15570 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63  ..  ** It is nec
15580 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
15590 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
155a0 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
155b0 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69  Rollback.  ** mi
155c0 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
155d0 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
155e0 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
155f0 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
15600 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ber.  ** that is
15610 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
15620 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
15630 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
15640 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a   pages must.  **
15650 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
15660 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
15670 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
15680 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61   */.  if( pPg->a
15690 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
156a0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41  .    IOTRACE(("A
156b0 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25  LWAYS_ROLLBACK %
156c0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
156d0 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
156e0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
156f0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
15700 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
15710 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
15720 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
15730 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  le.  */.  unlink
15740 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73  Page(pPg);.  ass
15750 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
15760 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  0 );..  *ppPg = 
15770 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
15780 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15790 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
157a0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65  is called to fre
157b0 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79  e superfluous dy
157c0 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
157d0 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65  ted memory.** he
157e0 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ld by the pager 
157f0 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69  system. Memory i
15800 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c  n use by any SQL
15810 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61  ite pager alloca
15820 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  ted.** by the cu
15830 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79  rrent thread may
15840 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29   be sqliteFree()
15850 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
15860 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
15870 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
15880 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
15890 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
158a0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
158b0 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
158c0 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20  rns. A negative 
158d0 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d  value for nReq m
158e0 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20  eans.** free as 
158f0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
15900 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74  ossible. The ret
15910 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
15920 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
15930 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
15940 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
15950 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15960 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
15970 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c  NAGEMENT.int sql
15980 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
15990 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
159a0 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64  {.  const Thread
159b0 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73  Data *pTsdro = s
159c0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
159d0 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e  ReadOnly();.  in
159e0 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
159f0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
15a00 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61  If the the globa
15a10 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  l mutex is held,
15a20 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
15a30 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20   becomes a.  ** 
15a40 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73  o-op; zero bytes
15a50 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66   of memory are f
15a60 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62  reed.  This is b
15a70 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65  ecause.  ** some
15a80 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76   of the code inv
15a90 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  oked by this fun
15aa0 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20  ction may also. 
15ab0 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69   ** try to obtai
15ac0 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73  n the mutex, res
15ad0 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64  ulting in a dead
15ae0 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
15af0 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
15b00 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  x(0) ){.    retu
15b10 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
15b20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72  Outermost loop r
15b30 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20  uns for at most 
15b40 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20  two iterations. 
15b50 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  First iteration 
15b60 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66  we.  ** try to f
15b70 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ind memory that 
15b80 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
15b90 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20  without calling 
15ba0 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a  fsync(). Second.
15bb0 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28    ** iteration (
15bc0 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20  which only runs 
15bd0 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69  if the first fai
15be0 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71  led to free nReq
15bf0 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d   bytes of.  ** m
15c00 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74  emory) is permit
15c10 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e  ted to call fsyn
15c20 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20  c(). This is of 
15c30 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65  course much more
15c40 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65   .  ** expensive
15c50 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
15c60 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20  ; i<=1; i++){.. 
15c70 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
15c80 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74  gh all the SQLit
15c90 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20  e pagers opened 
15ca0 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
15cb0 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61  hread. */.    Pa
15cc0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54  ger *pPager = pT
15cd0 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20  sdro->pPager;.  
15ce0 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20    for( ; pPager 
15cf0 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
15d00 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
15d10 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
15d20 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
15d30 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
15d40 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28  t rc;..      if(
15d50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
15d60 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
15d70 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f    }..      /* Fo
15d80 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72  r each pager, tr
15d90 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e  y to free as man
15da0 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
15db0 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20  ble (without .  
15dc0 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66      ** calling f
15dd0 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69  sync() if this i
15de0 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  s the first iter
15df0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74  ation of the out
15e00 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a  ermost .      **
15e10 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f   loop)..      */
15e20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51  .      while( SQ
15e30 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70  LITE_OK==(rc = p
15e40 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
15e50 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26  ger, i, &pPg)) &
15e60 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
15e70 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
15e80 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
15e90 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
15ea0 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
15eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
15ec0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
15ed0 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
15ee0 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
15ef0 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
15f00 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
15f10 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
15f20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
15f30 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
15f40 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
15f50 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
15f60 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
15f70 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
15f80 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
15f90 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
15fa0 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
15fb0 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
15fc0 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
15fd0 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
15fe0 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
15ff0 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
16000 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
16010 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
16020 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50       if( pPg==pP
16030 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
16040 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16050 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
16060 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
16070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
16080 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72  for( pTmp=pPager
16090 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
160a0 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
160b0 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
160c0 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
160d0 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
160e0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
160f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16100 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
16110 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
16120 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  g);.        IOTR
16130 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
16140 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16150 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
16160 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
16170 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
16180 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
16190 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
161a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Pg);.      }..  
161b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
161c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
161d0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
161e0 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
161f0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
16200 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20  ase file or .   
16210 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
16220 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
16230 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
16240 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
16250 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
16260 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
16270 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  function. Instea
16280 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  d, set the Pager
16290 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
162a0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  e..        ** Th
162b0 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
162c0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
162d0 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20  user (or users, 
162e0 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
162f0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
16300 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
16310 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
16320 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
16330 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
16340 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
16350 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
16360 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
16370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
16380 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
16390 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
163a0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
163b0 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
163c0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
163d0 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
163e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
163f0 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
16400 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16410 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
16420 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a  NAGEMENT */../*.
16430 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
16440 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50 67 20  ent of page pPg 
16450 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
16460 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ase file..*/.sta
16470 74 69 63 20 69 6e 74 20 72 65 61 64 44 62 50 61  tic int readDbPa
16480 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
16490 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20 50 67  , PgHdr *pPg, Pg
164a0 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
164b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  rc;.  assert( ME
164c0 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  MDB==0 );.  rc =
164d0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
164e0 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
164f0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
16500 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
16510 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
16520 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16530 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
16540 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
16550 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20  ATA(pPg),.      
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16570 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
16580 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 50 41 47  Size);.  }.  PAG
16590 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f  ER_INCR(sqlite3_
165a0 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
165b0 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  nt);.  PAGER_INC
165c0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
165d0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 50 47  ;.  IOTRACE(("PG
165e0 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
165f0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 50  ger, pgno));.  P
16600 41 47 45 52 54 52 41 43 45 33 28 22 46 45 54 43  AGERTRACE3("FETC
16610 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  H %d page %d\n",
16620 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16630 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
16640 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
16650 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
16660 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
16670 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f 5f 44  ((u8*)PGHDR_TO_D
16680 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c 0a 20  ATA(pPg))[24],. 
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
166c0 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69  eof(pPager->dbFi
166d0 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20  leVers));.  }.  
166e0 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 50  CODEC1(pPager, P
166f0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16700 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
16710 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16720 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
16730 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
16740 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 73   to obtain the s
16750 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71 75 69  hared lock requi
16760 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 64 61  red before.** da
16770 74 61 20 6d 61 79 20 62 65 20 72 65 61 64 20 66  ta may be read f
16780 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
16790 63 68 65 2e 20 49 66 20 74 68 65 20 73 68 61 72  che. If the shar
167a0 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c 72 65  ed lock has alre
167b0 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62 74 61  ady.** been obta
167c0 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ined, this funct
167d0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
167e0 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74 65 6c  **.** Immediatel
167f0 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e 69 6e  y after obtainin
16800 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  g the shared loc
16810 6b 20 28 69 66 20 72 65 71 75 69 72 65 64 29 2c  k (if required),
16820 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
16830 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61 20 68  * checks for a h
16840 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ot-journal file.
16850 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75 6e 64   If one is found
16860 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72  , an emergency r
16870 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20 70 65  ollback.** is pe
16880 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69 61 74  rformed immediat
16890 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
168a0 6e 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  nt pagerSharedLo
168b0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
168c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
168d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
168e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
168f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
16900 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
16910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16920 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
16930 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
16940 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
16950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
16960 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
16970 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
16980 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  D_LOCK);.       
16990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
169b0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
169c0 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
169d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
169e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
169f0 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
16a00 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a  LOCK );.      }.
16a10 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61    .      /* If a
16a20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
16a30 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
16a40 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
16a50 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20  ock on the.     
16a60 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
16a70 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
16a80 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
16a90 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
16aa0 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eted..      */. 
16ab0 20 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a       if( hasHotJ
16ac0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29  ournal(pPager) )
16ad0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74  {.        /* Get
16ae0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
16af0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16b00 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73  se file. At this
16b10 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20   point it is.   
16b20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
16b30 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
16b40 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
16b50 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
16b60 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
16b70 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
16b80 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
16b90 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
16ba0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
16bb0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
16bc0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
16bd0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
16be0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
16bf0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
16c00 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20   ** database is 
16c10 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69  safe to read whi
16c20 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
16c30 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67  is still rolling
16c40 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   it .        ** 
16c50 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a  back..        **
16c60 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63   .        ** Bec
16c70 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
16c80 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
16c90 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
16ca0 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
16cb0 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
16cc0 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
16cd0 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
16ce0 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
16cf0 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  to.        ** ob
16d00 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58  tain it's own EX
16d10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
16d20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16d30 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
16d40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16d50 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16d60 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  >fd, EXCLUSIVE_L
16d70 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
16d80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
16da0 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
16db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
16dc0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
16dd0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16df0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
16e00 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
16e10 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65   .        /* Ope
16e20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  n the journal fo
16e30 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20  r reading only. 
16e40 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   Return SQLITE_B
16e50 55 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a  USY if.        *
16e60 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20  * we are unable 
16e70 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72  to open the jour
16e80 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20  nal file. .     
16e90 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16ea0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
16eb0 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
16ec0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
16ed0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
16ee0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
16ef0 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
16f00 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
16f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
16f20 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lds.        ** a
16f30 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
16f40 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
16f50 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
16f60 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
16f70 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70   ** processes op
16f80 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ening the journa
16f90 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  l at the same ti
16fa0 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  me..        **..
16fb0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
16fc0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
16fd0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
16fe0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 09  is because in ..
16ff0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
17000 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
17010 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
17020 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
17030 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
17040 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
17050 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
17060 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
17070 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
17080 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
17090 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
170a0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
170b0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
170c0 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
170d0 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
170e0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
170f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
17100 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17110 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
17120 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
17130 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
17140 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
17150 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20 20 20  nt ro;.         
17160 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
17170 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
17180 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17190 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72  ite3OsOpenReadWr
171a0 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ite(pPager->zJou
171b0 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
171c0 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20 20 20  fd, &ro);.      
171d0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
171e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
171f0 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 20 20  ger->jfd );.    
17200 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a        if( ro ){.
17210 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
17220 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17230 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17240 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
17250 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
17260 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
17270 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17280 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17290 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
172a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
172b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
172c0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
172d0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
172e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
172f0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   1;.        pPag
17300 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
17310 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
17320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17330 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
17340 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
17350 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
17360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
17370 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20  r = 0;. .       
17380 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
17390 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
173a0 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
173b0 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
173c0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
173d0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
173e0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
173f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
17400 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
17410 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
17420 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17440 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
17450 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
17460 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
17470 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
17480 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
17490 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20  ER_SHARED || .  
174a0 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
174b0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
174c0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
174d0 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
174e0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
174f0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50   }..      if( pP
17500 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
17510 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
17520 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
17530 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
17540 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17550 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
17560 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
17570 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
17580 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
17590 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
175a0 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
175b0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
175c0 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
175d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
175e0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65         ** has be
175f0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
17600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
17610 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
17620 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17630 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a  cache..        *
17640 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74  *.        ** Dat
17650 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
17660 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
17670 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
17680 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
17690 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
176a0 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
176b0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
176c0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
176d0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
176e0 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
176f0 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
17700 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
17710 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
17720 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
17730 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
17740 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
17750 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
17760 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
17770 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
17780 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
17790 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
177a0 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
177b0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
177c0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
177d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74   .        ** det
177e0 65 63 68 65 64 2e 20 20 54 68 65 20 63 68 61 6e  eched.  The chan
177f0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
17800 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
17810 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
17820 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
17830 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
17840 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
17850 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
17860 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
17870 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20  FileVers)];.    
17880 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
17890 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
178a0 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
178b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
178c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
178d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
178e0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ode;.        }..
178f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
17900 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
17910 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
17920 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
17930 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
17940 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
17950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
17960 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
17970 70 50 61 67 65 72 2d 3e 66 64 2c 20 32 34 29 3b  pPager->fd, 24);
17980 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
179a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
179b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
179c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
179d0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
179e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
179f0 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
17a00 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
17a10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17a30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17a40 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
17a50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
17a60 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
17a70 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c 20 73  dbFileVers, 0, s
17a80 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17a90 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ));.        }.. 
17aa0 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d         if( memcm
17ab0 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  p(pPager->dbFile
17ac0 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73  Vers, dbFileVers
17ad0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
17ae0 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ers))!=0 ){.    
17af0 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65        pager_rese
17b00 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  t(pPager);.     
17b10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17b20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
17b30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
17b40 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
17b50 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
17b60 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
17b70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17b80 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
17b90 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
17ba0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
17bb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
17bc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17bd0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50 67  ** Allocate a Pg
17be0 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45 69  Hdr object.   Ei
17bf0 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e 65  ther create a ne
17c00 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a  w one or reuse.*
17c10 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e  * an existing on
17c20 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f 74  e that is not ot
17c30 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e 0a  herwise in use..
17c40 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48 64  **.** A new PgHd
17c50 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  r structure is c
17c60 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f 66  reated if any of
17c70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17c80 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a  re.** true:.**.*
17c90 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
17ca0 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64 20  ve not exceeded 
17cb0 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f  our maximum allo
17cc0 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65  cated cache size
17cd0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73 20  .**          as 
17ce0 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41 47  set by the "PRAG
17cf0 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20 63  MA cache_size" c
17d00 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
17d10 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72 65    (2)  There are
17d20 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64 72   no unused PgHdr
17d30 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61 62   objects availab
17d40 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  le at this time.
17d50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20 20  .**.**     (3)  
17d60 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  This is an in-me
17d70 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
17d80 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54 68  *.**     (4)  Th
17d90 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64 72  ere are no PgHdr
17da0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64 6f   objects that do
17db0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20 6a   not require a j
17dc0 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
17dd0 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e 64     file sync and
17de0 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20 6a   a sync of the j
17df0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
17e00 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20  urrently.**     
17e10 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64 2e       prohibited.
17e20 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
17e30 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73 74  , reuse an exist
17e40 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20 6f  ing PgHdr.  In o
17e50 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75 73  ther words, reus
17e60 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67  e an.** existing
17e70 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f 66   PgHdr if all of
17e80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
17e90 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  re true:.**.**  
17ea0 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
17eb0 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65 65  reached or excee
17ec0 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ded the maximum 
17ed0 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20  cache size.**   
17ee0 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20 62         allowed b
17ef0 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f  y "PRAGMA cache_
17f00 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  size"..**.**    
17f10 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20 61   (2)  There is a
17f20 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c 65   PgHdr available
17f30 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52 65   with PgHdr->nRe
17f40 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  f==0.**.**     (
17f50 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20 69  3)  We are not i
17f60 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
17f70 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20  atabase.**.**   
17f80 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74 68    (4)  Either th
17f90 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c 61  ere is an availa
17fa0 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20 64  ble PgHdr that d
17fb0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20  oes not need.** 
17fc0 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20 73           to be s
17fd0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f 72  ynced to disk or
17fe0 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63 69   else disk synci
17ff0 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ng is currently.
18000 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f  **          allo
18010 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  wed..*/.static i
18020 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65  nt pagerAllocate
18030 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
18040 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67  er, PgHdr **ppPg
18050 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
18060 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72  LITE_OK;.  PgHdr
18070 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 43 72 65   *pPg;..  /* Cre
18080 61 74 65 20 61 20 6e 65 77 20 50 67 48 64 72 20  ate a new PgHdr 
18090 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  if any of the fo
180a0 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65  ur conditions de
180b0 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76  fined .  ** abov
180c0 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a 20 20 69  e is met: */.  i
180d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
180e0 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a  <pPager->mxPage.
180f0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46     || pPager->pF
18100 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c 20 4d  irst==0 .   || M
18110 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50 61 67  EMDB.   || (pPag
18120 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
18130 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 64  ==0 && pPager->d
18140 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20  oNotSync).  ){. 
18150 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
18160 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48  Page>=pPager->nH
18170 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67  ash ){.      pag
18180 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
18190 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20  able(pPager,.   
181a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48        pPager->nH
181b0 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20  ash<256 ? 256 : 
181c0 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29  pPager->nHash*2)
181d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
181e0 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a  er->nHash==0 ){.
181f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
18200 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
18210 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c     goto pager_al
18220 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20  locate_out;.    
18230 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
18240 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  g = sqliteMalloc
18250 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67  Raw( sizeof(*pPg
18260 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ) + pPager->page
18270 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20  Size.           
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
182a0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
182d0 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
182e0 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 69 66 28  tory) );.    if(
182f0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
18300 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
18310 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  EM;.      goto p
18320 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
18330 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
18340 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
18350 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 69  of(*pPg));.    i
18360 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
18370 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
18380 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
18390 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50  er), 0, sizeof(P
183a0 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20  gHistory));.    
183b0 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
183c0 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
183d0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
183e0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
183f0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
18400 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72   pPg;.    pPager
18410 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
18420 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
18430 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67  >pPager->nMaxPag
18440 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
18450 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50  t( pPager->nMaxP
18460 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50  age==(pPager->nP
18470 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20  age-1) );.      
18480 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
18490 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
184a0 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c  e{.    /* Recycl
184b0 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61  e an existing pa
184c0 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72  ge with a zero r
184d0 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20  ef-count. */.   
184e0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79   rc = pager_recy
184f0 63 6c 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  cle(pPager, 1, &
18500 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
18510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18520 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
18530 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
18540 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
18550 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
18560 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18570 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20    assert(pPg);. 
18580 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67   }.  *ppPg = pPg
18590 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  ;..pager_allocat
185a0 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20  e_out:.  return 
185b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
185c0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
185d0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
185e0 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
185f0 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
18600 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
18610 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
18620 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
18630 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
18640 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
18650 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
18660 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
18670 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
18680 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
18690 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
186a0 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
186b0 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
186c0 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
186d0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
186e0 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
186f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
18700 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
18710 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
18720 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20  ->needRead ){.  
18730 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44    int rc = readD
18740 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65  bPage(pPg->pPage
18750 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e  r, pPg, pPg->pgn
18760 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
18770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18780 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
18790 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
187a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
187b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
187c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
187d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
187e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
187f0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
18800 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
18810 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
18820 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
18830 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
18840 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
18850 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
18860 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
18870 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
18880 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
18890 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
188a0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
188b0 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
188c0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
188d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
188e0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
188f0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
18900 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
18910 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
18920 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
18930 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
18940 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
18950 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
18960 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
18970 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
18980 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
18990 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
189a0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
189b0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
189c0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
189d0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
189e0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
189f0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
18a00 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
18a10 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
18a20 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18a30 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
18a40 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
18a50 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
18a60 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
18a70 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
18a80 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
18a90 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
18aa0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
18ab0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
18ac0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
18ad0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
18ae0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
18af0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
18b00 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
18b10 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
18b20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
18b30 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
18b40 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
18b50 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
18b60 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
18b70 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
18b80 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
18b90 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
18ba0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
18bb0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
18bc0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
18bd0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
18be0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
18bf0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
18c00 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
18c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
18c20 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
18c30 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
18c40 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
18c50 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
18c60 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
18c70 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
18c80 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
18c90 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
18ca0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
18cb0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
18cc0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
18cd0 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
18ce0 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
18cf0 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
18d00 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
18d10 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
18d20 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
18d30 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
18d40 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
18d50 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
18d60 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
18d70 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
18d80 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
18d90 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
18da0 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
18db0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
18dc0 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
18dd0 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
18de0 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
18df0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
18e00 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
18e10 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
18e20 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
18e30 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
18e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18e50 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
18e60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
18e70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
18e80 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
18e90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
18ea0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
18eb0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
18ec0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
18ed0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
18ee0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
18ef0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
18f00 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
18f10 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
18f20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
18f30 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
18f40 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
18f50 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
18f60 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
18f70 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  c;..  assert( pP
18f80 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
18f90 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61  ER_UNLOCK || pPa
18fa0 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
18fb0 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  gno==1 );..  /* 
18fc0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
18fd0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
18fe0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
18ff0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
19000 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
19010 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
19020 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
19030 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
19040 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
19050 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
19060 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
19070 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
19080 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
19090 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
190a0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
190b0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
190c0 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
190d0 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
190e0 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
190f0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
19100 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
19110 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
19120 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19130 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
19140 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
19150 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
19160 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
19170 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
19180 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20   accessed, then 
19190 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63  get a SHARED loc
191a0 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61  k.  ** on the da
191b0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67  tabase file. pag
191c0 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69  erSharedLock() i
191d0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20  s a no-op if .  
191e0 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f  ** a database lo
191f0 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68 65  ck is already he
19200 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ld..  */.  rc = 
19210 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
19220 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
19230 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19240 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19250 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
19260 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
19270 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70  R_UNLOCK );..  p
19280 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
19290 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
192a0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
192b0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
192c0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
192d0 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
192e0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
192f0 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b  nMax;.    int h;
19300 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
19310 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
19320 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c      rc = pagerAl
19330 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67 65  locatePage(pPage
19340 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  r, &pPg);.    if
19350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19360 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19370 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rc;.    }..    p
19380 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
19390 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45  .    assert( !ME
193a0 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67  MDB || pgno>pPag
193b0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a  er->stmtSize );.
193c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
193d0 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
193e0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
193f0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
19400 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
19410 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
19420 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
19430 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
19440 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
19450 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
19460 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
19470 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
19480 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
19490 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
194a0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
194b0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
194c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
194d0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
194e0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
194f0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ync = 0;.    }..
19500 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
19510 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65  g);.    pPg->nRe
19520 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
19530 46 4f 28 70 50 67 29 3b 0a 0a 20 20 20 20 70 50  FO(pPg);..    pP
19540 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
19550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45    if( pPager->nE
19560 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20  xtra>0 ){.      
19570 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
19580 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
19590 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
195a0 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20  Extra);.    }.  
195b0 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33    nMax = sqlite3
195c0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
195d0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
195e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
195f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
19600 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
19610 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67  .      rc = pPag
19620 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
19630 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19640 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75    }..    /* Popu
19650 6c 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69  late the page wi
19660 74 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20  th data, either 
19670 62 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  by reading from 
19680 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
19690 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20   ** file, or by 
196a0 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69  setting the enti
196b0 72 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e  re page to zero.
196c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
196d0 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c  nMax<(int)pgno |
196e0 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f  | MEMDB || (noCo
196f0 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
19700 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
19710 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ) ){.      memse
19720 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
19730 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
19740 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
19750 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
19760 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
19770 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
19780 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
19790 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
197a0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
197b0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
197c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
197d0 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
197e0 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
197f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19800 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
19810 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
19820 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
19830 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
19840 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19850 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
19860 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
19880 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
19890 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
198a0 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
198b0 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
198c0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
198d0 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
198e0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
198f0 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
19900 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
19910 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
19920 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
19930 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
19940 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
19950 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
19960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
19970 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
19980 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
19990 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
199a0 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
199b0 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
199c0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
199d0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
199e0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
199f0 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
19a00 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
19a10 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
19a20 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
19a30 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
19a40 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
19a50 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
19a60 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
19a70 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
19a80 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
19a90 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
19aa0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
19ab0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
19ac0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
19ad0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19af0 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
19b00 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
19b10 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
19b20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
19b30 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
19b40 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
19b50 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
19b60 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
19b70 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
19b80 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
19b90 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
19ba0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
19bb0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
19bc0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
19bd0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
19be0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
19bf0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
19c00 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
19c10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
19c20 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
19c30 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
19c40 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
19c50 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
19c60 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
19c70 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
19c80 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
19c90 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
19ca0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
19cb0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
19cc0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
19cd0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
19ce0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
19cf0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
19d00 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
19d10 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
19d20 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
19d30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
19d40 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
19d50 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
19d60 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
19d70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19d80 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19d90 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
19da0 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
19db0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
19dc0 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20  usiveMode );.   
19dd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
19de0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19df0 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
19e00 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
19e10 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
19e20 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
19e30 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
19e40 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
19e50 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
19e60 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
19e70 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
19e80 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
19e90 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
19ea0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
19eb0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
19ec0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
19ed0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
19ee0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
19ef0 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
19f00 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
19f10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
19f20 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
19f30 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
19f40 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
19f50 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
19f60 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
19f70 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
19f80 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19f90 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20  DbPage *pPg){.. 
19fa0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
19fb0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
19fc0 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
19fd0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
19fe0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
19ff0 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
1a000 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
1a010 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1a020 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
1a030 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
1a040 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
1a050 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
1a060 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
1a070 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
1a080 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1a090 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
1a0a0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
1a0b0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1a0c0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
1a0d0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
1a0e0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
1a0f0 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
1a100 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
1a110 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
1a120 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
1a130 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
1a140 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
1a150 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
1a160 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
1a170 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a180 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
1a190 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1a1a0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
1a1b0 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
1a1c0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
1a1d0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
1a1e0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
1a1f0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1a200 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
1a210 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
1a220 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
1a230 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
1a240 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1a250 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
1a260 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
1a270 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
1a280 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
1a290 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
1a2a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a2b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
1a2c0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
1a2d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a2e0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
1a2f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
1a300 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
1a310 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1a320 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1a330 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
1a340 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
1a350 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1a360 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1a370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a380 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1a390 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
1a3a0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
1a3b0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
1a3c0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
1a3d0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
1a3e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a3f0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
1a400 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1a410 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1a430 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
1a440 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1a450 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1a460 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
1a470 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1a480 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1a490 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
1a4a0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
1a4b0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1a4c0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
1a4d0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1a4e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1a4f0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1a500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1a510 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1a520 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a530 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1a540 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1a550 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a560 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1a570 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1a580 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1a590 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1a5a0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1a5b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1a5c0 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1a5d0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1a5e0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1a5f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a600 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1a610 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1a620 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1a630 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
1a640 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1a650 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1a690 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  e);.  assert( rc
1a6a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1a6b0 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20  Pager->jfd );.  
1a6c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a6d0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
1a6e0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1a6f0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1a700 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
1a710 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a720 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1a730 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1a740 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
1a750 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
1a760 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
1a770 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1a780 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1a790 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
1a7a0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
1a7b0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
1a7c0 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
1a7d0 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
1a7e0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1a7f0 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
1a800 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
1a810 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
1a820 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1a830 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
1a840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a850 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
1a860 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1a870 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
1a880 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1a890 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1a8a0 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
1a8b0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1a8c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1a8d0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
1a8e0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1a8f0 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
1a900 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1a910 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1a920 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1a930 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1a940 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
1a950 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1a960 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1a970 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
1a980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a990 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a9a0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1a9b0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1a9c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a9d0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
1a9e0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1a9f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1aa00 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
1aa10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1aa20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1aa30 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1aa40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1aa50 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
1aa60 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
1aa70 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
1aa80 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1aa90 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1aaa0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
1aab0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aac0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
1aad0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
1aae0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
1aaf0 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
1ab00 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
1ab10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
1ab20 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
1ab30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
1ab40 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
1ab50 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1ab60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1ab70 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
1ab80 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1ab90 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
1aba0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1abb0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
1abc0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
1abd0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
1abe0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
1abf0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
1ac00 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
1ac10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
1ac20 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
1ac30 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
1ac40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1ac50 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
1ac60 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
1ac70 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
1ac80 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
1ac90 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1aca0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1acb0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
1acc0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
1acd0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1ace0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1acf0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1ad00 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1ad10 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
1ad20 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
1ad30 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
1ad40 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
1ad50 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
1ad60 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1ad70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
1ad80 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
1ad90 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
1ada0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
1adb0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1adc0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1add0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
1ade0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
1adf0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
1ae00 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1ae10 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1ae20 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1ae30 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1ae40 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1ae50 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1ae60 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1ae70 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1ae80 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1ae90 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1aea0 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1aeb0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1aec0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1aed0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1aee0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1aef0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1af00 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1af10 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1af20 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1af30 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1af40 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1af50 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1af60 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1af70 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1af80 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1af90 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1afa0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1afb0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1afc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1afd0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1afe0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1aff0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1b000 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1b010 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1b020 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1b030 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1b040 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1b050 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1b060 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1b070 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1b080 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1b090 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
1b0a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1b0b0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1b0c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1b0e0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
1b0f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
1b100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b120 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1b130 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1b140 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
1b150 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1b160 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1b170 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1b180 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1b190 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b1a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1b1b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1b1c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1b1d0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1b1e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b1f0 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
1b200 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1b210 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1b220 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1b230 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1b240 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1b250 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1b260 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
1b270 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1b280 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1b290 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b2a0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1b2b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1b2c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b2d0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1b2e0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1b2f0 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1b300 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1b310 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
1b320 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1b330 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1b340 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1b350 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1b360 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1b370 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1b380 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1b390 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1b3a0 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1b3b0 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1b3c0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1b3d0 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
1b3e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b3f0 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1b400 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b410 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
1b420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b430 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1b440 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1b450 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1b460 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1b470 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1b480 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1b490 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1b4a0 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
1b4b0 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
1b4c0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1b4d0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1b4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b4f0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1b500 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1b510 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1b520 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1b530 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1b540 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1b550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1b560 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1b570 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1b580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1b590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b5a0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1b5b0 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1b5c0 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1b5d0 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1b5e0 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1b5f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1b600 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1b610 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
1b620 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
1b630 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1b640 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1b650 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b660 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1b670 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
1b680 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
1b690 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
1b6a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
1b6b0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
1b6c0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1b6d0 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
1b6e0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
1b6f0 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
1b700 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1b710 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
1b720 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
1b730 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
1b740 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
1b750 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
1b760 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b770 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
1b780 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1b790 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
1b7a0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1b7b0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
1b7c0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1b7d0 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
1b7e0 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  rty = pPg->pPrev
1b7f0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1b800 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44   if( pPg->pPrevD
1b810 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1b820 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
1b830 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1b840 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
1b850 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
1b860 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
1b870 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
1b880 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
1b890 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
1b8a0 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
1b8b0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
1b8c0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1b8d0 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
1b8e0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1b8f0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1b900 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
1b910 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
1b920 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
1b930 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1b940 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1b950 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1b960 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
1b970 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
1b980 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
1b990 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1b9a0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1b9b0 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
1b9c0 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
1b9d0 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
1b9e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b9f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
1ba00 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
1ba10 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
1ba20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
1ba30 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
1ba40 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
1ba50 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
1ba60 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
1ba70 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1ba80 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1ba90 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
1baa0 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
1bab0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1bac0 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
1bad0 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
1bae0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1baf0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
1bb00 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
1bb10 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
1bb20 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
1bb30 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
1bb40 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
1bb50 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
1bb60 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
1bb70 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
1bb80 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
1bb90 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1bba0 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
1bbb0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1bbc0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
1bbd0 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
1bbe0 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
1bbf0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
1bc00 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1bc10 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1bc20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bc30 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
1bc40 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
1bc50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1bc60 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
1bc70 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1bc80 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1bc90 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
1bca0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1bcb0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
1bcc0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1bcd0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
1bce0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1bcf0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
1bd00 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
1bd10 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1bd20 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1bd30 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
1bd40 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
1bd50 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
1bd60 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1bd70 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
1bd80 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
1bd90 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
1bda0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
1bdb0 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
1bdc0 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
1bdd0 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
1bde0 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
1bdf0 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
1be00 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
1be10 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
1be20 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
1be30 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1be40 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
1be50 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
1be60 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
1be70 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
1be80 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
1be90 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
1bea0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1beb0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
1bec0 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
1bed0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bee0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
1bef0 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
1bf00 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
1bf10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1bf20 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
1bf30 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
1bf40 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
1bf50 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
1bf60 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1bf70 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
1bf80 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
1bf90 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
1bfa0 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
1bfb0 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
1bfc0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1bfd0 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
1bfe0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
1bff0 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
1c000 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1c010 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
1c020 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
1c030 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1c040 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
1c050 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
1c060 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
1c070 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
1c080 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
1c090 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
1c0a0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c0b0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
1c0c0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
1c0d0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
1c0e0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1c0f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c100 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1c110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c120 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
1c130 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c150 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c160 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1c170 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1c180 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1c190 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1c1a0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1c1b0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1c1c0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1c1d0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1c1e0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1c1f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c200 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1c210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1c220 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1c230 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
1c240 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1c250 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
1c260 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1c270 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
1c280 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1c290 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
1c2a0 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
1c2b0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
1c2c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1c2d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1c2e0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
1c2f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1c300 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
1c310 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1c320 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
1c330 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1c340 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1c350 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1c360 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   (pPager->useJou
1c370 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29  rnal || MEMDB) )
1c380 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
1c390 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
1c3a0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1c3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1c3c0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66  szPg;.        if
1c3d0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1c3e0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1c3f0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1c400 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1c410 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  r);.          PA
1c420 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e  GERTRACE3("JOURN
1c430 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1c440 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c450 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1c460 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1c470 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
1c480 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
1c490 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
1c4a0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
1c4b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1c4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1c4d0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1c4f0 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
1c500 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1c510 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1c520 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1c530 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1c540 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
1c550 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20   cksum, saved;. 
1c560 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
1c570 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20  Data2, *pEnd;.  
1c580 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
1c590 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
1c5a0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1c5b0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
1c5c0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1c5d0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
1c5e0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
1c5f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1c600 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
1c610 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
1c620 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
1c630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c640 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
1c650 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1c660 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
1c670 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1c680 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1c690 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
1c6a0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
1c6b0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
1c6c0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
1c6d0 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
1c6e0 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e  Data2 + pPager->
1c6f0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
1c700 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b      pData2 -= 4;
1c710 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1c720 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a   = *(u32*)pEnd;.
1c730 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62            put32b
1c740 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29  its(pEnd, cksum)
1c750 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67  ;.          szPg
1c760 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1c770 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20  ize+8;.         
1c780 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
1c790 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
1c7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1c7b0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c7c0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
1c7d0 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20  , szPg);.       
1c7e0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
1c7f0 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
1c800 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1c810 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
1c820 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1c830 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a  ->journalOff, sz
1c840 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
1c850 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1c860 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
1c870 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
1c880 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1c890 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
1c8a0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c8b0 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
1c8c0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1c8d0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1c8e0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
1c8f0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1c900 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
1c910 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
1c920 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61  *(u32*)pEnd = sa
1c930 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65  ved;...  /* An e
1c940 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
1c950 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1c960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
1c970 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  e .          ** 
1c980 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
1c990 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1c9a0 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f  by the layer abo
1c9b0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
1c9c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1c9f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
1ca00 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50   }..          pP
1ca10 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
1ca20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ca30 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ca40 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
1ca50 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
1ca60 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
1ca70 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1ca80 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
1ca90 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1caa0 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
1cab0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
1cac0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1cad0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
1cae0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1caf0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1cb00 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1cb10 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  7);.          }.
1cb20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1cb40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1cb50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1cb60 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
1cb70 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1cb80 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1cb90 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1cba0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1cbb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cbc0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cbd0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1cbe0 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1cbf0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1cc00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1cc10 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cc20 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1cc30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1cc40 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1cc50 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1cc60 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1cc70 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1cc80 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1cc90 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1cca0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1ccb0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1ccc0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1ccd0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1cce0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1ccf0 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1cd00 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1cd10 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1cd20 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1cd30 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1cd40 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1cd50 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1cd60 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1cd70 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1cd80 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
1cd90 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
1cda0 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
1cdb0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
1cdc0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
1cdd0 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
1cde0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1cdf0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1ce00 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1ce10 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1ce20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1ce30 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1ce40 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1ce50 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1ce60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1ce70 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1ce80 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1ce90 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1cea0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1ceb0 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1cec0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1ced0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1cee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1cef0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1cf00 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1cf10 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1cf20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1cf30 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1cf40 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1cf50 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1cf60 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1cf70 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1cf80 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
1cf90 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1cfa0 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
1cfb0 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
1cfc0 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32  *pData2 = CODEC2
1cfd0 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1cfe0 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b  pPg->pgno, 7)-4;
1cff0 0a 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69  .        put32bi
1d000 74 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e  ts(pData2, pPg->
1d010 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  pgno);.        r
1d020 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
1d030 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
1d040 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
1d050 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20  >pageSize+4);.  
1d060 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1d070 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
1d080 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
1d090 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1d0a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d0b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d0c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d0d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d0e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d0f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1d100 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
1d110 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
1d120 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
1d130 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1d140 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1d150 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1d160 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
1d170 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
1d180 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
1d190 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
1d1a0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1d1b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1d1c0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
1d1d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1d1e0 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
1d1f0 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
1d200 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
1d210 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
1d220 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1d230 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
1d240 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
1d250 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
1d260 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
1d270 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d290 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
1d2a0 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
1d2b0 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
1d2c0 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
1d2d0 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
1d2e0 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
1d2f0 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
1d300 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1d310 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
1d320 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
1d330 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
1d340 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
1d350 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1d360 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
1d370 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
1d380 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
1d390 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
1d3a0 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
1d3b0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
1d3c0 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
1d3d0 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
1d3e0 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
1d3f0 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
1d400 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
1d410 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
1d420 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1d430 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d440 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1d450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d460 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
1d470 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
1d480 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1d490 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
1d4a0 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
1d4b0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d4c0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
1d4d0 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
1d4e0 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
1d4f0 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
1d500 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28  ageSize);..  if(
1d510 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65   !MEMDB && nPage
1d520 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20  PerSector>1 ){. 
1d530 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75     Pgno nPageCou
1d540 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nt;          /* 
1d550 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
1d560 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73  pages in databas
1d570 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67  e file */.    Pg
1d580 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20  no pg1;         
1d590 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1d5a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1d5b0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1d5c0 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e  ed on. */.    in
1d5d0 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
1d5e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1d5f0 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74  r of pages start
1d600 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f  ing at pg1 to jo
1d610 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74  urnal */.    int
1d620 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74   ii;..    /* Set
1d630 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66   the doNotSync f
1d640 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69  lag to 1. This i
1d650 73 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e  s because we can
1d660 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72  not allow a jour
1d670 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65  nal.    ** heade
1d680 72 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  r to be written 
1d690 62 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65  between the page
1d6a0 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74  s journaled by t
1d6b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
1d6c0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1d6d0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1d6e0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  nc==0 );.    pPa
1d6f0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1d700 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73   1;..    /* This
1d710 20 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74   trick assumes t
1d720 68 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67  hat both the pag
1d730 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f  e-size and secto
1d740 72 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a  r-size are.    *
1d750 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77  * an integer pow
1d760 65 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73  er of 2. It sets
1d770 20 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f   variable pg1 to
1d780 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a   the identifier.
1d790 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1d7a0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1d7b0 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f  sector pPg is lo
1d7c0 63 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f  cated on..    */
1d7d0 0a 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67  .    pg1 = ((pPg
1d7e0 2d 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50  ->pgno-1) & ~(nP
1d7f0 61 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29  agePerSector-1))
1d800 20 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65   + 1;..    nPage
1d810 43 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50  Count = sqlite3P
1d820 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1d830 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1d840 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f  Pg->pgno>nPageCo
1d850 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
1d860 67 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20  ge = (pPg->pgno 
1d870 2d 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65  - pg1)+1;.    }e
1d880 6c 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61  lse if( (pg1+nPa
1d890 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e  gePerSector-1)>n
1d8a0 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20  PageCount ){.   
1d8b0 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
1d8c0 43 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20  Count+1-pg1;.   
1d8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50   }else{.      nP
1d8e0 61 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65  age = nPagePerSe
1d8f0 63 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ctor;.    }.    
1d900 61 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b  assert(nPage>0);
1d910 0a 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c  .    assert(pg1<
1d920 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  =pPg->pgno);.   
1d930 20 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61   assert((pg1+nPa
1d940 67 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  ge)>pPg->pgno);.
1d950 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
1d960 69 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  i<nPage && rc==S
1d970 51 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b  QLITE_OK; ii++){
1d980 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d  .      Pgno pg =
1d990 20 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69   pg1+ii;.      i
1d9a0 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1d9b0 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
1d9c0 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
1d9d0 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
1d9e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
1d9f0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1da00 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
1da10 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
1da20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
1da30 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1da40 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
1da50 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
1da60 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1da70 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1da80 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50  (pPager, pg, &pP
1da90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1daa0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
1dac0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1dad0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1dae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1daf0 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  erUnref(pPage);.
1db00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1db10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1db20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
1db30 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1db40 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61  nc==1 );.    pPa
1db50 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d  ger->doNotSync =
1db60 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1db70 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1db80 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  e(pDbPage);.  }.
1db90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1dba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1dbb0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
1dbc0 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
1dbd0 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
1dbe0 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
1dbf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1dc00 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
1dc10 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
1dc20 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
1dc30 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
1dc40 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1dc50 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
1dc60 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
1dc70 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1dc80 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
1dc90 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
1dca0 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  rty;.}.#endif..#
1dcb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dcc0 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
1dcd0 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
1dce0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
1dcf0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
1dd00 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
1dd10 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
1dd20 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
1dd30 65 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65  e3PagerOverwrite
1dd40 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1dd50 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
1dd60 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
1dd70 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b   *pPg;.  int rc;
1dd80 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1dd90 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1dda0 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20   pgno, &pPg);.  
1ddb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ddc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1ddd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1dde0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1ddf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1de00 20 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69       memcpy(sqli
1de10 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
1de20 70 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61  pPg), pData, pPa
1de30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1de40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1de50 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1de60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1de70 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
1de80 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
1de90 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
1dea0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
1deb0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
1dec0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
1ded0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
1dee0 6e 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20  n page pPg back 
1def0 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65  to the disk, eve
1df00 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74  n though.** that
1df10 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d   page might be m
1df20 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a  arked as dirty..
1df30 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79  **.** The overly
1df40 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79  ing software lay
1df50 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
1df60 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f  utine when all o
1df70 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e  f the data.** on
1df80 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
1df90 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20  is unused.  The 
1dfa0 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20  pager marks the 
1dfb0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f  page as clean so
1dfc0 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73  .** that it does
1dfd0 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e   not get written
1dfe0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
1dff0 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20  Tests show that 
1e000 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
1e010 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68  n, together with
1e020 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
1e030 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1e040 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
1e050 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
1e060 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
1e070 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
1e080 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
1e090 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
1e0a0 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
1e0b0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
1e0c0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1e0d0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
1e0e0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
1e0f0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
1e100 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
1e110 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1e120 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73  back() for the s
1e130 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c  ame page.** will
1e140 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69   thereafter be i
1e150 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73  gnored.  This is
1e160 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76   necessary to av
1e170 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a  oid a problem.**
1e180 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69   where a page wi
1e190 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64  th data is added
1e1a0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1e1b0 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74   during one part
1e1c0 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63   of.** a transac
1e1d0 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65  tion then remove
1e1e0 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  d from the freel
1e1f0 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74  ist during a lat
1e200 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68  er part.** of th
1e210 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69  e same transacti
1e220 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f  on and reused fo
1e230 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1e240 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a  pose.  When it.*
1e250 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64  * is first added
1e260 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1e270 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1e280 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20  s called.  When 
1e290 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73  reused,.** the s
1e2a0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e2b0 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  ollback() routin
1e2c0 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75  e is called.  Bu
1e2d0 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  t because the.**
1e2e0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
1e2f0 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65  ritical data, we
1e300 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62   still need to b
1e310 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a  e sure it gets.*
1e320 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  * rolled back in
1e330 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71   spite of the sq
1e340 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1e350 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a  llback() call..*
1e360 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
1e370 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50  gerDontWrite(DbP
1e380 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20  age *pDbPage){. 
1e390 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1e3a0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1e3b0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e3c0 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d  ager;..  if( MEM
1e3d0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  DB ) return;.  p
1e3e0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1e3f0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
1e400 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
1e410 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1e420 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1e430 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1e440 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1e450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1e460 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
1e470 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
1e480 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
1e490 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
1e4a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
1e4b0 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
1e4c0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
1e4d0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
1e4e0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
1e4f0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
1e500 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
1e510 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
1e520 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
1e530 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
1e540 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1e550 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
1e560 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
1e570 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
1e580 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
1e590 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
1e5a0 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
1e5b0 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
1e5c0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
1e5d0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
1e5e0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
1e5f0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
1e600 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1e610 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
1e620 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
1e630 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
1e640 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
1e650 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
1e660 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
1e670 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
1e680 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
1e690 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
1e6a0 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1e6b0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
1e6c0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
1e6d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
1e6e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1e6f0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
1e700 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
1e710 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
1e720 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ).      makeClea
1e730 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  n(pPg);.#ifdef S
1e740 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1e750 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
1e760 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
1e770 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
1e780 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
1e790 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1e7a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1e7b0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1e7c0 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
1e7d0 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
1e7e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1e7f0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
1e800 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
1e810 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
1e820 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
1e830 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
1e840 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
1e850 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
1e860 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
1e870 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
1e880 20 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74   we have not yet
1e890 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74   actually read t
1e8a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1e8b0 69 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74  is page (if.** t
1e8c0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61  he PgHdr.needRea
1e8d0 64 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74  d flag is set) t
1e8e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1e8f0 20 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69   acts as a promi
1e900 73 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69  se.** that we wi
1e910 6c 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  ll never need to
1e920 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63   read the page c
1e930 6f 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75  ontent in the fu
1e940 74 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20  ture..** so the 
1e950 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61  needRead flag ca
1e960 6e 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  n be cleared at 
1e970 74 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76  this point..*/.v
1e980 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1e990 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50  DontRollback(DbP
1e9a0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
1e9b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e9c0 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73  ->pPager;..  ass
1e9d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1e9e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
1e9f0 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1ea00 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1ea10 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1ea20 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
1ea30 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
1ea40 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1ea50 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
1ea60 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
1ea70 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
1ea80 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
1ea90 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1eaa0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1eab0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1eac0 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
1ead0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1eae0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1eaf0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1eb00 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
1eb10 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70  urnal = 1;.    p
1eb20 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30  Pg->needRead = 0
1eb30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1eb40 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1eb50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1eb60 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1eb70 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1eb80 6e 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20  no&7);.    }.   
1eb90 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
1eba0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
1ebb0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
1ebc0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
1ebd0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49  (pPager));.    I
1ebe0 4f 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45  OTRACE(("GARBAGE
1ebf0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1ec00 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
1ec10 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1ec20 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26  >stmtInUse .   &
1ec30 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
1ec40 6e 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28  nt(pPg) .   && (
1ec50 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1ec60 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1ec70 0a 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  .  ){.    assert
1ec80 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1ec90 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
1eca0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
1ecb0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
1ecc0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
1ecd0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
1ece0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1ecf0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1ed00 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1ed10 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
1ed20 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1ed30 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
1ed40 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
1ed50 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
1ed60 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
1ed70 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
1ed80 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
1ed90 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1eda0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1edb0 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
1edc0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
1edd0 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1ede0 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1edf0 20 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61   rc;..  if( !pPa
1ee00 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1ee10 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
1ee20 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
1ee30 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
1ee40 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
1ee50 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1ee60 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
1ee70 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1ee80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1ee90 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
1eea0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1eeb0 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
1eec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1eed0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1eee0 20 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68   .    /* Read th
1eef0 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1ef00 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
1ef10 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
1ef20 72 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69  r = retrieve32bi
1ef30 74 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a  ts(pPgHdr, 24);.
1ef40 20 20 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d    .    /* Increm
1ef50 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
1ef60 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
1ef70 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
1ef80 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
1ef90 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1efa0 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
1efb0 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
1efc0 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
1efd0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
1efe0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
1eff0 73 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65  se the page refe
1f000 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71  rence. */.    sq
1f010 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1f020 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61  pPgHdr);.    pPa
1f030 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
1f040 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Done = 1;.  }.  
1f050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
1f070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f080 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
1f090 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
1f0a0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
1f0b0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
1f0c0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
1f0d0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
1f0e0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
1f0f0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
1f100 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
1f110 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
1f120 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
1f130 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
1f140 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
1f150 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1f160 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1f170 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f180 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
1f190 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
1f1a0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
1f1b0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
1f1c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1f1d0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
1f1e0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
1f1f0 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
1f200 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
1f210 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
1f220 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
1f230 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1f240 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
1f250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1f260 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
1f270 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
1f280 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
1f290 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
1f2a0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
1f2b0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
1f2c0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
1f2d0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1f2e0 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
1f2f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
1f300 65 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e  eter nTrunc is n
1f310 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1f320 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20  e pager file is 
1f330 74 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20  truncated to.** 
1f340 6e 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68  nTrunc pages (th
1f350 69 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75  is is used by au
1f360 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1f370 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ses)..*/.int sql
1f380 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f390 68 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70  haseOne(Pager *p
1f3a0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1f3b0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1f3c0 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1f3d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f3e0 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
1f3f0 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1f400 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1f410 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1f420 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1f430 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1f440 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1f450 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1f460 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1f470 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1f480 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1f490 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1f4a0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1f4b0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1f4c0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1f4d0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1f4e0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1f4f0 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1f500 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1f510 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1f520 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
1f530 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1f540 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
1f550 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
1f560 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1f570 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1f580 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1f590 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1f5a0 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
1f5b0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
1f5c0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1f5d0 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
1f5e0 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
1f5f0 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
1f600 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1f610 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
1f620 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1f630 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
1f640 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
1f650 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
1f660 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
1f670 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
1f680 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
1f690 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1f6a0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
1f6b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
1f6c0 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
1f6d0 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
1f6e0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
1f6f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1f700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f710 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1f720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f730 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1f740 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1f750 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1f760 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1f770 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1f780 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1f790 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1f7a0 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
1f7b0 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1f7c0 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1f7d0 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1f7e0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1f7f0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
1f800 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1f810 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
1f820 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1f830 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1f840 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1f850 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1f860 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1f870 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1f880 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1f890 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1f8a0 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1f8b0 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1f8c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1f8d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f8e0 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
1f8f0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1f900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f910 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1f920 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1f930 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f940 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1f950 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1f960 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
1f970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1f980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f990 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1f9a0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1f9b0 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1f9c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1f9d0 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1f9e0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1f9f0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
1fa00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fa10 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fa20 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
1fa30 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1fa40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fa50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fa60 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fa70 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1fa80 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1fa90 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
1faa0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
1fab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
1fac0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
1fad0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69  nTrunc);.      i
1fae0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1faf0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1fb00 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  t;.    }.#endif.
1fb10 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c  .    /* Write al
1fb20 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  l dirty pages to
1fb30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fb40 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20  le */.    pPg = 
1fb50 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1fb60 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
1fb70 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  );.    rc = page
1fb80 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1fb90 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  (pPg);.    if( r
1fba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fbb0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1fbc0 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1fbd0 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  y = 0;..    /* S
1fbe0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1fbf0 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1fc00 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1fc10 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1fc20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
1fc30 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
1fc40 20 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28    }.    IOTRACE(
1fc50 28 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20  ("DBSYNC %p\n", 
1fc60 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50  pPager))..    pP
1fc70 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1fc80 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65  GER_SYNCED;.  }e
1fc90 6c 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26  lse if( MEMDB &&
1fca0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1fcb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fcc0 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67  gerTruncate(pPag
1fcd0 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d  er, nTrunc);.  }
1fce0 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1fcf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1fd00 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
1fd10 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1fd20 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
1fd30 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1fd40 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1fd50 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
1fd60 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
1fd70 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
1fd80 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
1fd90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1fda0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
1fdb0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
1fdc0 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1fdd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1fde0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
1fdf0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
1fe00 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1fe10 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
1fe20 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  pPg;..  if( pPag
1fe30 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
1fe40 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
1fe50 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
1fe60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1fe70 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
1fe80 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1fe90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1fea0 7d 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  }.  PAGERTRACE2(
1feb0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
1fec0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1fed0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1fee0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1fef0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1ff00 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1ff10 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
1ff20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1ff30 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1ff40 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1ff50 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
1ff60 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
1ff70 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
1ff80 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1ff90 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
1ffa0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
1ffb0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
1ffc0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1ffd0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
1ffe0 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
1fff0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
20000 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
20010 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
20020 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
20030 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
20040 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
20050 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
20060 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
20070 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
20080 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
20090 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
200a0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
200b0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
200c0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
200d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
200e0 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
200f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20100 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
20110 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
20120 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
20130 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
20140 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
20150 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
20160 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20170 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
20180 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20190 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
201a0 79 43 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65  yCache );.  asse
201b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
201c0 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
201d0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
201e0 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
201f0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
20200 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
20210 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
20220 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
20230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
20240 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
20250 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
20260 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
20270 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
20280 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
20290 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
202a0 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
202b0 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
202c0 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
202d0 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
202e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
202f0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
20300 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
20310 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
20320 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
20330 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
20340 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c   protocol or unl
20350 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
20360 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
20370 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
20380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
20390 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
203a0 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
203b0 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
203c0 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
203d0 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
203e0 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
203f0 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
20400 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
20410 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
20420 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
20430 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
20440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20450 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  erRollback(Pager
20460 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
20470 20 72 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43   rc;.  PAGERTRAC
20480 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
20490 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
204a0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
204b0 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
204c0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
204d0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
204e0 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
204f0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
20500 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
20510 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
20520 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
20530 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
20540 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20550 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
20560 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
20570 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
20580 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
20590 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
205a0 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
205b0 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
205c0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
205d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
205e0 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
205f0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
20600 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
20610 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
20620 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
20630 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
20640 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
20650 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
20660 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41  ize);.        PA
20670 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42  GERTRACE3("ROLLB
20680 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
20690 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
206a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
206b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
206c0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
206d0 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
206e0 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
206f0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
20700 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
20710 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
20720 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
20730 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
20740 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
20750 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48  al = 0;.      pH
20760 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
20770 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
20780 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
20790 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
207a0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
207b0 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
207c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
207d0 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67  Reiniter(p, pPag
207e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
207f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
20800 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
20810 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
20820 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
20830 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
20840 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
20850 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74  ize;.    pager_t
20860 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50  runcate_cache(pP
20870 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
20880 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
20890 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
208a0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
208b0 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ED;.    return S
208c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
208d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
208e0 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
208f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
20900 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
20910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20920 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
20930 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
20940 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
20950 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
20960 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
20970 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
20980 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
20990 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
209a0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
209b0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
209c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
209d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
209e0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
209f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
20a00 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
20a10 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
20a20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
20a30 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
20a40 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
20a50 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
20a60 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
20a70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20a80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
20a90 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
20aa0 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
20ab0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
20ac0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  r, 0);.  }.  /* 
20ad0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
20ae0 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  er); */.  pPager
20af0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
20b00 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
20b10 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
20b20 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
20b30 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
20b40 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
20b50 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
20b60 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
20b70 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
20b80 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
20b90 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
20ba0 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
20bb0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
20bc0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
20bd0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
20be0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20bf0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
20c00 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
20c10 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
20c20 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
20c30 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
20c40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20c50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
20c60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
20c70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
20c80 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
20c90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
20ca0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20cb0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
20cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20cd0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
20ce0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20cf0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
20d00 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
20d10 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
20d20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
20d30 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
20d40 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
20d50 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
20d60 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
20d70 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20d80 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
20d90 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
20da0 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
20db0 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
20dc0 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
20dd0 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
20de0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
20df0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
20e00 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
20e10 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
20e20 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
20e30 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
20e40 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
20e50 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
20e60 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
20e70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
20e80 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
20e90 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
20ea0 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
20eb0 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
20ec0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
20ed0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
20ee0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
20ef0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
20f00 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
20f10 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
20f20 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
20f30 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
20f40 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
20f50 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
20f60 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
20f70 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
20f80 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
20f90 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
20fa0 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
20fb0 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
20fc0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
20fd0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
20fe0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20ff0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
21000 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
21010 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
21020 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21030 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
21040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
21050 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
21060 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
21070 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
21080 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21090 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
210a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
210b0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
210c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
210d0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
210e0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
210f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21100 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
21110 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
21120 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
21130 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
21140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21150 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
21160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21170 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
21180 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
21190 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
211a0 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
211b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
211c0 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
211d0 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
211e0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
211f0 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
21200 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21210 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
21220 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
21230 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
21240 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
21250 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
21260 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
21270 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
21280 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
21290 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
212a0 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
212b0 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
212c0 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
212d0 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
212e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
212f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
21300 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21310 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
21320 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
21330 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
21340 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
21350 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
21360 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
21370 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
21380 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
21390 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
213a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
213b0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
213c0 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
213d0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
213e0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
213f0 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
21400 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21410 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
21420 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
21430 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
21440 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
21450 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
21460 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
21470 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
21480 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
21490 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
214a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
214b0 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
214c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
214d0 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61  gerStmtCommit(Pa
214e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
214f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
21500 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
21510 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
21520 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
21530 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
21540 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21550 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
21560 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
21570 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
21580 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
21590 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
215a0 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
215b0 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
215c0 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
215d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
215e0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
215f0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
21600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21610 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
21620 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
21630 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
21640 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
21650 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
21660 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
21670 20 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70         pNext = p
21680 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b  Hist->pNextStmt;
21690 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
216a0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29   pHist->inStmt )
216b0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
216c0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
216d0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
216e0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
216f0 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
21700 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
21710 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
21720 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
21730 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
21740 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
21750 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
21760 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
21770 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
21780 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
21790 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
217a0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
217b0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
217c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
217d0 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
217e0 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
217f0 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
21800 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
21810 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
21820 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
21830 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21840 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
21850 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
21860 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
21870 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
21880 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
21890 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48   *pPg;.      PgH
218a0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
218b0 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
218c0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
218d0 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78   pPg=pHist->pNex
218e0 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
218f0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
21900 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
21910 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
21920 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
21930 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
21940 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
21950 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
21960 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
21970 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
21980 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
21990 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
219a0 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
219b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
219c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
219d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
219e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
219f0 0a 20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75  .      pager_tru
21a00 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
21a10 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
21a20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
21a40 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
21a50 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
21a60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
21a70 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
21a80 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
21a90 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
21aa0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
21ab0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
21ac0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
21ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
21ae0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
21af0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
21b00 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
21b10 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
21b20 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61  PagerFilename(Pa
21b30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21b40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
21b50 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
21b60 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 69  ** Return the di
21b70 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64  rectory of the d
21b80 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
21b90 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
21ba0 69 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65  ite3PagerDirname
21bb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21bc0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
21bd0 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a  ->zDirectory;.}.
21be0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21bf0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
21c00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21c10 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
21c20 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
21c30 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  Journalname(Page
21c40 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21c50 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
21c60 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
21c70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
21c80 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
21c90 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
21ca0 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
21cb0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
21cc0 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
21cd0 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
21ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21cf0 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  rNosync(Pager *p
21d00 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
21d10 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b   pPager->noSync;
21d20 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
21d30 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a  E_HAS_CODEC./*.*
21d40 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65 63 20  * Set the codec 
21d50 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a  for this pager.*
21d60 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21d70 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
21d80 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
21d90 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
21da0 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
21db0 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
21dc0 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50  CodecArg.){.  pP
21dd0 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78  ager->xCodec = x
21de0 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d  Codec;.  pPager-
21df0 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f  >pCodecArg = pCo
21e00 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66  decArg;.}.#endif
21e10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21e20 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21e30 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
21e40 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
21e50 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61  by pData to loca
21e60 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65  tion pgno in the
21e70 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68   file. .**.** Th
21e80 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72  ere must be no r
21e90 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
21ea0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67   current page pg
21eb0 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70  no. If current p
21ec0 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e  age.** pgno is n
21ed0 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ot already in th
21ee0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21ef0 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72  al, it is not wr
21f00 69 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a  itten there by.*
21f10 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  * by this routin
21f20 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c  e. The same appl
21f30 69 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ies to the page 
21f40 70 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20  pData refers to 
21f50 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74  on entry to.** t
21f60 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
21f70 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f  ** References to
21f80 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
21f90 64 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65  d to by pData re
21fa0 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61  main valid. Upda
21fb0 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61  ting any.** meta
21fc0 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64  -data associated
21fd0 20 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61   with page pData
21fe0 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
21ff0 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
22000 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
22010 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
22020 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
22030 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
22040 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
22050 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
22060 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
22070 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
22080 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
22090 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
220a0 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
220b0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
220c0 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
220d0 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
220e0 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
220f0 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
22100 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
22110 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
22120 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
22130 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
22140 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
22150 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22160 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
22170 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
22180 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
22190 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
221a0 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67  ; .  int h;.  Pg
221b0 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  no needSyncPgno 
221c0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
221d0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a  pPg->nRef>0 );..
221e0 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4d    PAGERTRACE5("M
221f0 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
22200 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
22210 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
22220 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
22230 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
22240 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
22250 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  gno);.  IOTRACE(
22260 28 22 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c  ("MOVE %p %d %d\
22270 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
22280 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20  >pgno, pgno)).. 
22290 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
222a0 6e 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70  nt(pPg);.  if( p
222b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
222c0 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
222d0 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
222e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
222f0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
22300 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
22310 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
22320 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
22330 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
22340 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
22350 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
22360 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
22370 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
22380 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
22390 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
223a0 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
223b0 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
223c0 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
223d0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
223e0 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
223f0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
22400 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
22410 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
22420 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
22430 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
22440 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
22450 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
22460 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
22470 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
22480 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
22490 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
224a0 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
224b0 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
224c0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
224d0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
224e0 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
224f0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
22500 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50  Old);.    if( pP
22510 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
22520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22530 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
22540 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
22550 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
22560 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
22570 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
22580 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
22590 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
225a0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
225b0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
225c0 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
225d0 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
225e0 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
225f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  */.  assert( pgn
22600 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70  o!=0 );.  pPg->p
22610 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20  gno = pgno;.  h 
22620 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  = pgno & (pPager
22630 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66  ->nHash-1);.  if
22640 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
22650 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
22660 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
22670 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
22680 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
22690 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
226a0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
226b0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
226c0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
226d0 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
226e0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
226f0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
22700 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79   0;..  makeDirty
22710 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
22720 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
22730 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
22740 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
22750 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
22760 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
22770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
22780 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
22790 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
227a0 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
227b0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
227c0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
227d0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
227e0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
227f0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
22800 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
22810 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
22820 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
22830 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
22840 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
22850 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
22860 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
22870 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
22880 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
22890 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
228a0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
228b0 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
228c0 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
228d0 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c  3PagerGet() call
228e0 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a   may cause the j
228f0 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20  ournal to sync. 
22900 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  So make.    ** s
22910 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65  ure the Pager.ne
22920 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73  edSync flag is s
22930 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20  et too..    */. 
22940 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50     int rc;.    P
22950 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
22960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
22970 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
22980 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
22990 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e  gerGet(pPager, n
229a0 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50  eedSyncPgno, &pP
229b0 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
229c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
229d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
229e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
229f0 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e   1;.    pPgHdr->
22a00 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
22a10 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72    pPgHdr->inJour
22a20 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b  nal = 1;.    mak
22a30 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a  eDirty(pPgHdr);.
22a40 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
22a50 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
22a60 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
22a70 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
22a80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
22a90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22aa0 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
22ab0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
22ac0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
22ad0 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
22ae0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
22af0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
22b00 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
22b10 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
22b20 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
22b30 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
22b40 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
22b50 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
22b60 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
22b70 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
22b80 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
22b90 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
22ba0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
22bb0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
22bc0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
22bd0 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
22be0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
22bf0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
22c00 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
22c10 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
22c20 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
22c30 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
22c40 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
22c50 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
22c60 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22c70 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
22c80 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22c90 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
22ca0 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
22cb0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
22cc0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
22cd0 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
22ce0 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
22cf0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
22d00 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
22d10 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
22d20 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22d30 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
22d40 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22d50 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
22d60 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
22d70 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
22d80 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
22d90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22da0 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
22db0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
22dc0 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
22dd0 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
22de0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
22df0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
22e00 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
22e10 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
22e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
22e30 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
22e40 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
22e50 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
22e60 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
22e70 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
22e80 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
22e90 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
22ea0 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
22eb0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
22ec0 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
22ed0 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
22ee0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
22ef0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
22f00 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
22f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
22f20 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
22f30 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  usiveMode;.}..#i
22f40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22f50 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
22f60 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
22f70 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22f80 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
22f90 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
22fa0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
22fb0 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
22fc0 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
22fd0 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
22fe0 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
22ff0 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
23000 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
23010 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
23020 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
23030 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
23040 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
23050 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53  n sqlite3OsLockS
23060 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29  tate(pPager->fd)
23070 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
23080 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
23090 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69  /*.** Print a li
230a0 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66  sting of all ref
230b0 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e  erenced pages an
230c0 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e  d their ref coun
230d0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
230e0 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50  e3PagerRefdump(P
230f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
23100 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66   PgHdr *pPg;.  f
23110 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
23120 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
23130 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
23140 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c    if( pPg->nRef<
23150 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
23160 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
23170 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20  rintf("PAGE %3d 
23180 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c  addr=%p nRef=%d\
23190 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d  n", .       pPg-
231a0 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
231b0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
231c0 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  nRef);.  }.}.#en
231d0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  dif..#endif /* S
231e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
231f0 4f 20 2a 2f 0a                                   O */.