/ Hex Artifact Content
Login

Artifact 79a4587cc5e84a7ca1e211fa273bb2071a78447b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 35  : pager.c,v 1.35
0350: 31 20 32 30 30 37 2f 30 37 2f 32 30 20 30 30 3a  1 2007/07/20 00:
0360: 33 33 3a 33 36 20 64 72 68 20 45 78 70 20 24 0a  33:36 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
19b0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
19c0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
19d0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
19e0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
19f0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1a00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1a10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1a20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1a30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1a40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1a50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1a60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1a70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1a80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1a90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1aa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ab0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1ac0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1ad0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1ae0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1af0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
1b00: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
1b10: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
1b20: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
1b30: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
1b40: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
1b50: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
1b60: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
1b70: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
1b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b90: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
1ba0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
1bb0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
1bc0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
1bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1be0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
1bf0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
1c00: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c10: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
1c20: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
1c30: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
1c40: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
1c50: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
1c60: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
1c70: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
1c80: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1c90: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1ca0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
1cb0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
1cc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
1cd0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ce0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1cf0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
1d00: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
1d10: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
1d20: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
1d30: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
1d40: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
1d50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d60: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
1d70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
1d80: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
1d90: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
1da0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
1db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1dc0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
1dd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1de0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1df0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e00: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
1e10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
1e20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1e30: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
1e40: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1e50: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
1e60: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
1e70: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
1e80: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
1e90: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
1ea0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
1eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
1ed0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ee0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
1ef0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
1f00: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
1f10: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1f20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1f30: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
1f40: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
1f50: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
1f60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1f70: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
1f80: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
1fa0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
1fb0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
1fc0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1fd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
1fe0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
1ff0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2000: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2010: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2020: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2030: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2040: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2050: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2060: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2070: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2080: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2090: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
20a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
20b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
20c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
20d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
20e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
20f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2100: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2110: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2120: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2130: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2140: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2150: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2160: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2170: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2180: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2190: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
21a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
21b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
21c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
21d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
21f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2200: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2210: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2220: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2230: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2240: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2250: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2260: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2270: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2280: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2290: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
22a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
22b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
22c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
22d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
22e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
22f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2300: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2310: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2320: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2330: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2340: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2350: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2360: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2370: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2380: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2390: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
23a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
23b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
23c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
23d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
23e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
23f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2400: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2410: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2420: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2430: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2440: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2450: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2460: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2470: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2480: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2490: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
24a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
24b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
24c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
24d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
24e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
24f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2500: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2510: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2520: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2530: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2540: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2550: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2560: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2570: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2580: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2590: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
25a0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
25b0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
25c0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
25d0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
25e0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
25f0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2600: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2610: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2620: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2630: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2640: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2650: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2660: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2670: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2680: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2690: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
26a0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
26b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
26c0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
26d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
26e0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
26f0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2700: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2710: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2720: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2730: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2740: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2750: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2760: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2770: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2780: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2790: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
27a0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
27b0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
27c0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
27d0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
27e0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
27f0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2800: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2810: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
2820: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
2830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
2860: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
2870: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
2880: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
28c0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
28d0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
28e0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
28f0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
2900: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
2910: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
2920: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
2930: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
2940: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
2950: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
2960: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
2970: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
2980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2990: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
29c0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
29d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
29e0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
29f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
2a00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
2a10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
2a20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
2a30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2a40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
2a50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
2a60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
2a70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2a80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2a90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
2aa0: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
2ab0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
2ac0: 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20   u8 needRead;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  /* Read content 
2af0: 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29 20  if PagerWrite() 
2b00: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73  is called */.  s
2b10: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
2b40: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
2b50: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
2b60: 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20  , *pPrevDirty;  
2b70: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
2b80: 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65   */.  u32 notUse
2b90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ba0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73       /* Buffer s
2bb0: 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  pace */.#ifdef S
2bc0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2bd0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
2be0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2bf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
2c00: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
2c10: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
2c20: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
2c30: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
2c40: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
2c50: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
2c60: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
2c70: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
2c80: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
2c90: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
2ca0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
2cb0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
2cc0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
2cd0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
2ce0: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
2cf0: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
2d00: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
2d10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d20: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
2d30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
2d40: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
2d50: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
2d60: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
2d70: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
2d90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
2da0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2db0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2dc0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
2dd0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
2de0: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
2df0: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
2e00: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
2e10: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
2e20: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
2e30: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
2e40: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
2e50: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
2e60: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
2e70: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
2e80: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
2e90: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
2ea0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2eb0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
2ec0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
2ed0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2ee0: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2ef0: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2f00: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2f10: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2f20: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2f30: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2f40: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2f50: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f60: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2f70: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
2f80: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
2f90: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
2fa0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2fb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2fc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
2ff0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3000: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3010: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3020: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3030: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3040: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
3060: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
3070: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3080: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
3090: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
30a0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
30b0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
30c0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
30d0: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
30e0: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
30f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3100: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3110: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3120: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3130: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3140: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3150: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
3160: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
3170: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
3180: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
3190: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
31a0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
31b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
31c0: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
31d0: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
31e0: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
31f0: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
3200: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
3210: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3220: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
3230: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
3240: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
3250: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
3260: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
3270: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
3280: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
3290: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
32a0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
32b0: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
32c0: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
32d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
32e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
32f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3300: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
3310: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
3320: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
3330: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
3340: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
3350: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
3360: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
3370: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
3380: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
3390: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
33a0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
33b0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
33c0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
33d0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
33e0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
33f0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
3400: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
3410: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
3420: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
3430: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
3440: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
3450: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
3460: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
3470: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
3480: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
3490: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
34a0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
34b0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
34c0: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
34d0: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
34e0: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
34f0: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
3500: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3510: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3530: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3540: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3550: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3560: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3570: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3580: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3590: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
35b0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
35c0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
35d0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
35e0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
35f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3600: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3610: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3620: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3640: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3660: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3670: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3690: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
36a0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
36b0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
36c0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
36d0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
36e0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
36f0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3700: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3710: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3720: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3730: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3740: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3750: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3770: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3780: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3790: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
37a0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
37c0: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
37d0: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
37e0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3800: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3810: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3820: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3830: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3850: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3860: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3870: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3890: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
38a0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
38b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38d0: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
38e0: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
38f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3900: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3920: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
3930: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
3940: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
3950: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
3960: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
3970: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
3980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3990: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
39b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
39c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
39d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3a00: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3a10: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3a20: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a40: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3a50: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3a60: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3a70: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
3a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a90: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
3aa0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
3ab0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
3ac0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3ad0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3ae0: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3af0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3b00: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
3b10: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
3b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
3b50: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
3b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
3b80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
3b90: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
3bb0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
3bc0: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
3bd0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
3be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bf0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
3c00: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
3c10: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3c20: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
3c50: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
3c60: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3c70: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
3c90: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
3ca0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
3cb0: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
3cc0: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
3cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ce0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
3cf0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
3d00: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
3d10: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3d20: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3d30: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
3d40: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
3d60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d80: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
3d90: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3dc0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3dd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3e10: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
3e20: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
3e30: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
3e40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
3e50: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
3e60: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
3e70: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
3ea0: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
3eb0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3ec0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
3ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3ee0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
3ef0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
3f00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
3f10: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
3f30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
3f40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
3f50: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
3f60: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3f70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3f80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3f90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
3fa0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3fb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3fd0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3fe0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3ff0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
4000: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
4010: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
4020: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
4030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
4040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4050: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
4060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
4070: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
40a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
40b0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
40c0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
40d0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
40e0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
40f0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
4100: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
4110: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
4120: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
4130: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
4140: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
4150: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
4160: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
4170: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
4180: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
41b0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
41c0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
41d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
41e0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
41f0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
4200: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
4210: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
4220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4230: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4260: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4270: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4280: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4290: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
42a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
42b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
42c0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
42d0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
42e0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
42f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
4300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
4310: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
4320: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
4330: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4340: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4350: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4360: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4370: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4390: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
43a0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
43c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
43d0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
43e0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
43f0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
4400: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4410: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4430: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4440: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4450: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4460: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4470: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4480: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4490: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
44a0: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
44b0: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
44c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
44d0: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
44e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
44f0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4500: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4510: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4520: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4540: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4550: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4560: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4570: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4580: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4590: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
45a0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
45b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
45c0: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
45d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
45e0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4600: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4610: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4620: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4640: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4650: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4660: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4680: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4690: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
46b0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
46c0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
46d0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
46e0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4700: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4710: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4720: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4730: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4740: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4750: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4760: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4770: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4790: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
47a0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
47b0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
47c0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
47d0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
47e0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
47f0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4800: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4810: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4820: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4840: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4850: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4860: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4870: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4880: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4890: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48a0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
48b0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
48c0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
48d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
48e0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48f0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4900: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4910: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4920: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4930: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4940: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4950: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4960: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4970: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
49a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
49b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
49c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
49d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
49e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
49f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
4a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
4a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
4a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
4a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
4a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
4a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
4a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
4a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
4a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
4a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
4aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
4ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
4ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
4ad0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
4ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
4af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
4b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
4b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
4b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
4b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
4b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
4b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
4b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
4b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
4b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
4b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
4ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
4bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
4bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
4bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
4be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
4bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
4c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
4c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
4c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
4c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
4c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
4c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
4c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
4c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
4c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
4ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
4cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
4cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
4cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
4ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
4cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
4d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
4d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
4d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
4d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
4d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
4d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
4d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
4d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
4d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
4d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
4da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
4db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
4dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
4dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
4de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
4df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
4e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
4e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
4e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
4e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
4e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
4e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
4e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
4e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
4e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
4e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
4ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
4eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
4ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
4ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
4ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
4f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
4f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
4f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
4f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
4f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4f50: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
4f60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4f70: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
4f80: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
4f90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
4fa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4fb0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4fc0: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4fd0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4fe0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4ff0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5000: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
5010: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
5020: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
5030: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
5040: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
5050: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
5060: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5070: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5080: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5090: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
50a0: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
50b0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
50c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
50d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
50e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
50f0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5100: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
5110: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
5120: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
5130: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
5140: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
5150: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
5160: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5170: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5180: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5190: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
51a0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
51b0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
51c0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
51d0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
51e0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5200: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
5210: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
5220: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
5230: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
5240: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
5250: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
5260: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5270: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5280: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5290: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
52a0: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
52b0: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
52c0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
52d0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
52e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
52f0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5300: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5320: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5330: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5340: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5350: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5360: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5370: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5380: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5390: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
53a0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
53b0: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
53c0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
53d0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
53e0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
53f0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5400: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5410: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5420: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5430: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5440: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5450: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5460: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5470: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5480: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5490: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
54a0: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
54b0: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
54c0: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
54e0: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
54f0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
5500: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5510: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
5520: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
5530: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
5540: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
5550: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
5560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
5570: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
5580: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
5590: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
55a0: 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-3d total=%d\n
55b0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
55c0: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
55d0: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d  (p), p->nRef, p-
55e0: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20  >pPager->nRef.  
55f0: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
5600: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
5610: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
5620: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
5630: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
5640: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
5650: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
5660: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
5670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5680: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
5690: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
56a0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
56b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
56c0: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
56d0: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
56e0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
56f0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
5700: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
5710: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
5730: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
5740: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5750: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5760: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
5770: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74  MEMDB ){.    ret
5780: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  urn PGHDR_TO_HIS
5790: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e  T(pPg, pPager)->
57a0: 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  inStmt;.  }else{
57b0: 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
57c0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
57d0: 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e  u8 *a = pPager->
57e0: 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74  aInStmt;.    ret
57f0: 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70  urn (a && (int)p
5800: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
5810: 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f  tSize && (a[pgno
5820: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
5830: 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7))));.  }.}../*
5840: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
5850: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
5860: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
5870: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
5880: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
5890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
58a0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
58b0: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
58c0: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
58d0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
58e0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
58f0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
5900: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
5910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5920: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
5930: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
5940: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5950: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5960: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5970: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5980: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5990: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
59a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
59b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
59c0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
59d0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
59e0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
59f0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
5a00: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
5a10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
5a20: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
5a30: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
5a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5a50: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
5a60: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
5a70: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
5a80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5a90: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
5aa0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
5ab0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
5ac0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
5ad0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
5ae0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
5af0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
5b00: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
5b10: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
5b20: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
5b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
5b40: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
5b50: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
5b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
5b70: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
5b80: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
5b90: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
5ba0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5bb0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
5bc0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
5bd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5be0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5bf0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
5c00: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
5c10: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
5c20: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
5c30: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
5c40: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
5c50: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
5c60: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
5c70: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5c80: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
5c90: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
5ca0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5cb0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5cc0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5cd0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5ce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5cf0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5d00: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5d10: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5d20: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5d30: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5d40: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5d50: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5d60: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5d70: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5d80: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5d90: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5da0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5db0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5dc0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5dd0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5de0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5e00: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5e10: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5e20: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5e30: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5e40: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5e50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5e60: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5e70: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
5e80: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
5e90: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
5ea0: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
5eb0: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
5ec0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
5ed0: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
5ee0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
5ef0: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
5f00: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
5f10: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
5f20: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
5f30: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
5f40: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
5f50: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
5f60: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
5f70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
5f80: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
5f90: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
5fa0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
5fb0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
5fc0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
5fd0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
5fe0: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
5ff0: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c  s persistent. Al
6000: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 41 50 49  l subsequent API
6010: 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50   calls on this P
6020: 61 67 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d  ager.** will imm
6030: 65 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20  ediately return 
6040: 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63  the same error c
6050: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
6060: 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50  nt pager_error(P
6070: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
6080: 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32  t rc){.  int rc2
6090: 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20   = rc & 0xff;.  
60a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
60b0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
60c0: 46 55 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  FULL || pPager->
60d0: 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
60e0: 4f 4b 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  OK );.  if(.    
60f0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
6100: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
6110: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
6120: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
6130: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
6140: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
6150: 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  rc;.  }.  return
6160: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
6170: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6180: 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20 74  GES is defined t
6190: 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73  hen we do some s
61a0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a  anity checking.*
61b0: 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75  * on the cache u
61c0: 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63  sing a hash func
61d0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75  tion.  This is u
61e0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a  sed for testing.
61f0: 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ** and debugging
6200: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66   only..*/.#ifdef
6210: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6220: 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  GES./*.** Return
6230: 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f   a 32-bit hash o
6240: 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  f the page data 
6250: 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74  for pPage..*/.st
6260: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 64  atic u32 pager_d
6270: 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74  atahash(int nByt
6280: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
6290: 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *pData){.  u32 
62a0: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
62b0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
62c0: 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nByte; i++){.   
62d0: 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30   hash = (hash*10
62e0: 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a  39) + pData[i];.
62f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73    }.  return has
6300: 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20  h;.}.static u32 
6310: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 50  pager_pagehash(P
6320: 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20  gHdr *pPage){.  
6330: 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74  return pager_dat
6340: 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61  ahash(pPage->pPa
6350: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a  ger->pageSize, .
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65          (unsigne
6380: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
6390: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a  O_DATA(pPage));.
63a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
63b0: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
63c0: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
63d0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
63e0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
63f0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
6400: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
6410: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
6420: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
6430: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
6440: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
6450: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
6460: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
6470: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
6480: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
6490: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
64a0: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
64b0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
64c0: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
64d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
64e0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
64f0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
6500: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
6510: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d  ->errCode || MEM
6520: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
6530: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
6540: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
6550: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
6560: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
6570: 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  e pager_datahash
6580: 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65  (X,Y)  0.#define
6590: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
65a0: 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48  X)  0.#define CH
65b0: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
65c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
65d0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
65e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
65f0: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
6600: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
6610: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6620: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
6630: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
6640: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
6650: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
6660: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
6670: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
6680: 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74  alloc(). *pzMast
6690: 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  er is.** set to 
66a0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d  point at the mem
66b0: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
66c0: 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
66d0: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73  caller must.** s
66e0: 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d  qliteFree() *pzM
66f0: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
6700: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
6710: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
6720: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
6730: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
6740: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
6750: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
6760: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
6770: 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a  Journal(OsFile *
6780: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a  pJrnl, char **pz
6790: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
67a0: 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20  c;.  u32 len;.  
67b0: 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63  i64 szJ;.  u32 c
67c0: 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ksum;.  int i;. 
67d0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
67e0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
67f0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6800: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6810: 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  /..  *pzMaster =
6820: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
6830: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
6840: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
6850: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6860: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
6870: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
6880: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
6890: 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69  nl, szJ-16);.  i
68a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
68b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a   ) return rc;. .
68c0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
68d0: 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a  s(pJrnl, &len);.
68e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
68f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6900: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6910: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75  its(pJrnl, &cksu
6920: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
6930: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6940: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6950: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
6960: 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20  , aMagic, 8);.  
6970: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6980: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
6990: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
69a0: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
69b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
69c0: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
69d0: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
69e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
69f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6a00: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68   *pzMaster = (ch
6a10: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
6a20: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  c(len+1);.  if( 
6a30: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
6a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6a50: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
6a60: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
6a70: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
6a80: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
6a90: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6aa0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
6ab0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
6ac0: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
6ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6ae0: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
6af0: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
6b00: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
6b10: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
6b20: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
6b30: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
6b40: 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d  = (*pzMaster)[i]
6b50: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
6b60: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
6b70: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
6b80: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
6b90: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
6ba0: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
6bb0: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
6bc0: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
6bd0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
6be0: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
6bf0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
6c00: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
6c10: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
6c20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
6c30: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
6c40: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
6c50: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
6c60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
6c70: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
6c80: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
6c90: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
6ca0: 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c     (*pzMaster)[l
6cb0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  en] = '\0';.  }.
6cc0: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
6cd0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6ce0: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
6cf0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6d00: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
6d10: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
6d20: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
6d30: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
6d40: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
6d50: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
6d60: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
6d70: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
6d80: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
6d90: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
6da0: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
6db0: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
6dd0: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
6e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e20: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
6e90: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a  static int seekJ
6ea0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
6eb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
6ec0: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
6ed0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
6ee0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
6ef0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
6f00: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
6f10: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
6f20: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
6f30: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6f40: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6f50: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
6f60: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
6f70: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
6f80: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
6f90: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
6fa0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6fb0: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
6fc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
6fd0: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73  fset;.  return s
6fe0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
6ff0: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
7000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d  ->journalOff);.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
7020: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
7030: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
7040: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7050: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  d. A journal.** 
7060: 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f  header (JOURNAL_
7070: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
7080: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
7090: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
70a0: 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t the.** current
70b0: 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
70c0: 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20   The format for 
70d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
70e0: 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  er is as follows
70f0: 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20  :.** - 8 bytes: 
7100: 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e  Magic identifyin
7110: 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  g journal format
7120: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
7130: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
7140: 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72  s in journal, or
7150: 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   -1 no-sync mode
7160: 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62   is on..** - 4 b
7170: 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d  ytes: Random num
7180: 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67  ber used for pag
7190: 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62  e hash..** - 4 b
71a0: 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61  ytes: Initial da
71b0: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
71c0: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
71d0: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65   Sector size use
71e0: 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73  d by the process
71f0: 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73   that wrote this
7200: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a   journal..** .**
7210: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
7220: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
7230: 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  4) bytes of unus
7240: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
7250: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
7260: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
7270: 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a  Pager){.  char z
7280: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7290: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d  ournalMagic)+16]
72a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
72b0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
72c0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
72d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
72e0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
72f0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20  rnalOff;.  }..  
7300: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
7310: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
7320: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7330: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
7340: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
7350: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
7360: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7370: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
7380: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
7390: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
73a0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
73b0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
73c0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
73d0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
73e0: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
73f0: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
7400: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
7410: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
7420: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
7430: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
7440: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
7450: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
7460: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
7470: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
7480: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
7490: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
74a0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70  is..  */.  memcp
74b0: 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72  y(zHeader, aJour
74c0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
74d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
74e0: 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20  ;.  /* The nRec 
74f0: 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46  Field. 0xFFFFFFF
7500: 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f  F for no-sync jo
7510: 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74  urnals. */.  put
7520: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
7530: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7540: 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e  agic)], pPager->
7550: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
7560: 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54  fff : 0);.  /* T
7570: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
7580: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
7590: 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61   */ .  sqlite3Ra
75a0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
75b0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
75c0: 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  t), &pPager->cks
75d0: 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32  umInit);.  put32
75e0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
75f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7600: 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+4], pPager->
7610: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a  cksumInit);.  /*
7620: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
7630: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
7640: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
7650: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
7660: 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61  alMagic)+8], pPa
7670: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
7680: 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73  /* The assumed s
7690: 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74  ector size for t
76a0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
76b0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
76c0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
76d0: 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70  nalMagic)+12], p
76e0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
76f0: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
7700: 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c  JHDR %p %lld %d\
7710: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
7720: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20  er->journalHdr, 
7730: 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29  sizeof(zHeader))
7740: 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ).  rc = sqlite3
7750: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
7760: 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69  jfd, zHeader, si
7770: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a  zeof(zHeader));.
7780: 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61  .  /* The journa
7790: 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65  l header has bee
77a0: 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73  n written succes
77b0: 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65  sfully. Seek the
77c0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69   journal.  ** fi
77d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
77e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
77f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
7800: 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  ector..  */.  if
7810: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7820: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
7830: 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e  "JTAIL %p %lld\n
7840: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
7850: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
7860: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
7870: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
7880: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
7890: 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20  urnalOff-1);.   
78a0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
78b0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
78c0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
78d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30  pPager->jfd, "\0
78e0: 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  00", 1);.    }. 
78f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7900: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
7910: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
7920: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
7930: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
7940: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
7950: 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  e.** (JOURNAL_HD
7960: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72  R_SZ bytes) is r
7970: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72  ead from the cur
7980: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
7990: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
79a0: 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  file. See commen
79b0: 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ts above functio
79c0: 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  n writeJournalHd
79d0: 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  r() for a descri
79e0: 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  ption of.** the 
79f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
7a00: 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ormat..**.** If 
7a10: 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65  the header is re
7a20: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ad successfully,
7a30: 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f   *nRec is set to
7a40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
7a50: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
7a60: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
7a70: 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65  ader and *dbSize
7a80: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
7a90: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
7aa0: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
7ab0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
7ac0: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
7ad0: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
7ae0: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
7af0: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
7b00: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
7b10: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
7b20: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
7b30: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
7b40: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
7b50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
7b60: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
7b70: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
7b80: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
7b90: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65  eturned and *nRe
7ba0: 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72  c and *dbSize ar
7bb0: 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a  e not set.  If J
7bc0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
7bd0: 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  tes.** cannot be
7be0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
7bf0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65  ournal file an e
7c00: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7c10: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
7c20: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
7c30: 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50  Hdr(.  Pager *pP
7c40: 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75  ager, .  i64 jou
7c50: 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20  rnalSize,.  u32 
7c60: 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a  *pNRec, .  u32 *
7c70: 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74  pDbSize.){.  int
7c80: 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
7c90: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
7ca0: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
7cb0: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
7cc0: 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20  ader */..  rc = 
7cd0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
7ce0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
7cf0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7d00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
7d10: 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f  rnalOff+JOURNAL_
7d20: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e  HDR_SZ(pPager) >
7d30: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a   journalSize ){.
7d40: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7d50: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
7d60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
7d70: 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  d(pPager->jfd, a
7d80: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
7d90: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
7da0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7db0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
7dc0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
7dd0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
7de0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
7df0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
7e00: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
7e10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
7e20: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
7e30: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
7e40: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
7e50: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7e60: 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  d, &pPager->cksu
7e70: 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63  mInit);.  if( rc
7e80: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7e90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
7ea0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  (pPager->jfd, pD
7eb0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
7ec0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
7ed0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
7ee0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
7ef0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
7f00: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
7f10: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
7f20: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
7f30: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
7f40: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
7f50: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
7f60: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
7f70: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
7f80: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
7f90: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
7fa0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
7fb0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
7fc0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
7fd0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
7fe0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
7ff0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
8000: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
8010: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
8020: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
8030: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
8040: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
8050: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
8060: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
8070: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8080: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
8090: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
80a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
80b0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
80c0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
80d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
80e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
80f0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
8100: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
8110: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
8120: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
8130: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
8140: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
8150: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
8160: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
8170: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
8180: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
8190: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
81a0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
81b0: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
81c0: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
81d0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
81e0: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
81f0: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
8200: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
8210: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
8220: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
8230: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
8240: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
8250: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
8260: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
8270: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8280: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
8290: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
82a0: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
82b0: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
82c0: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
82d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
82e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
82f0: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
8300: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
8310: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
8320: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
8330: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
8340: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
8350: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
8360: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
8370: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
8380: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
8390: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
83a0: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
83b0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
83c0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
83d0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
83e0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
83f0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
8400: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
8410: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20  u32 cksum = 0;. 
8420: 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f   char zBuf[sizeo
8430: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8440: 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a  +2*4];..  if( !z
8450: 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72  Master || pPager
8460: 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74  ->setMaster) ret
8470: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8480: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8490: 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d  er = 1;..  len =
84a0: 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29   strlen(zMaster)
84b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
84c0: 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b  en; i++){.    ck
84d0: 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69  sum += zMaster[i
84e0: 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  ];.  }..  /* If 
84f0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
8500: 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68  e, advance to th
8510: 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74  e next disk sect
8520: 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  or before writin
8530: 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65  g.  ** the maste
8540: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
8550: 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20  This is in case 
8560: 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67  the previous pag
8570: 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a  e written to.  *
8580: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61  * the journal ha
8590: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
85a0: 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ynced..  */.  if
85b0: 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
85c0: 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  nc ){.    rc = s
85d0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
85e0: 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
85f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
8610: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8620: 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a  ff += (len+20);.
8630: 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62  .  rc = write32b
8640: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
8650: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
8660: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
8670: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
8680: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8690: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
86a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
86b0: 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69  aster, len);.  i
86c0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
86d0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
86e0: 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c   put32bits(zBuf,
86f0: 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69   len);.  put32bi
8700: 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73  ts(&zBuf[4], cks
8710: 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a  um);.  memcpy(&z
8720: 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c  Buf[8], aJournal
8730: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
8740: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
8750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
8760: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
8770: 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66  , zBuf, 8+sizeof
8780: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
8790: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
87a0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
87b0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
87c0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
87d0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
87e0: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
87f0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
8800: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
8810: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8820: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
8830: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
8840: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
8850: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
8860: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
8870: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8880: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
8890: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
88a0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
88b0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
88c0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
88d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
88e0: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
88f0: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
8900: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
8910: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
8920: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
8930: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8940: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
8950: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
8960: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
8970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
8980: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
8990: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
89a0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
89b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
89c0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
89d0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
89e0: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
89f0: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
8a00: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
8a10: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
8a20: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
8a30: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
8a40: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
8a50: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
8a60: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
8a70: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
8a80: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
8a90: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
8aa0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
8ab0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
8ac0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
8ad0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
8ae0: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
8af0: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
8b00: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
8b10: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
8b20: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
8b30: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
8b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
8b50: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
8b60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
8b70: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
8b80: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
8b90: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
8ba0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
8bb0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
8bc0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
8bd0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
8be0: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
8bf0: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
8c00: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
8c10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8c20: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
8c30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8c50: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67  pager_unlock(Pag
8c60: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
8c70: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
8c80: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
8c90: 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
8ca0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
8cb0: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
8cc0: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
8cd0: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
8ce0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52  = -1;.      IOTR
8cf0: 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c  ACE(("UNLOCK %p\
8d00: 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
8d10: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
8d20: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
8d30: 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  OCK;.    pPager-
8d40: 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
8d50: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
8d60: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
8d70: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
8d80: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
8d90: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
8da0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
8db0: 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  e. This is a no-
8dc0: 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72 20  op if the pager 
8dd0: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
8de0: 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72  red.** the error
8df0: 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  -state..*/.stati
8e00: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
8e10: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
8e20: 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ger *p){.  if( p
8e30: 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74 75  ->errCode ) retu
8e40: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rn;.  assert( p-
8e50: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
8e60: 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75  SERVED || p->jou
8e70: 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20  rnalOpen==0 );. 
8e80: 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50   if( p->state>=P
8e90: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
8ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
8eb0: 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20  rRollback(p);.  
8ec0: 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b  }.  pager_unlock
8ed0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
8ee0: 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d  ->errCode || !p-
8ef0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
8f00: 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  (p->exclusiveMod
8f10: 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  e&&!p->journalOf
8f20: 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
8f30: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
8f40: 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d  ->stmtOpen || p-
8f50: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
8f60: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ;.}.../*.** Clea
8f70: 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  r the in-memory 
8f80: 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
8f90: 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65  tine.** sets the
8fa0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
8fb0: 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74  ger back to what
8fc0: 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20   it was when it 
8fd0: 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65  was first.** ope
8fe0: 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61  ned.  Any outsta
8ff0: 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
9000: 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20  invalidated and 
9010: 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d  subsequent attem
9020: 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  pts.** to access
9030: 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c   those pages wil
9040: 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20  l likely result 
9050: 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
9060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
9070: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
9080: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9090: 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
90a0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
90b0: 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a  rCode ) return;.
90c0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
90d0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
90e0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54  =pNext){.    IOT
90f0: 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70  RACE(("PGFREE %p
9100: 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
9110: 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  pPg->pgno));.   
9120: 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
9130: 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
9140: 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65  _count);.    pNe
9150: 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  xt = pPg->pNextA
9160: 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ll;.    sqliteFr
9170: 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ee(pPg);.  }.  p
9180: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
9190: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
91a0: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
91b0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
91c0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c   0;.  pPager->pL
91d0: 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ast = 0;.  pPage
91e0: 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70  r->pAll = 0;.  p
91f0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
9200: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
9210: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
9220: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
9230: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   0;.  pPager->aH
9240: 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ash = 0;.  pPage
9250: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a  r->nRef = 0;.}..
9260: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
9270: 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61  ne ends a transa
9280: 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61  ction.  A transa
9290: 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62  ction is ended b
92a0: 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f  y either.** a CO
92b0: 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41  MMIT or a ROLLBA
92c0: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  CK..**.** When t
92d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
92e0: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
92f0: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
9300: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
9310: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
9320: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
9330: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
9340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
9350: 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ll release.** th
9360: 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20  e database lock 
9370: 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 53  and acquires a S
9380: 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74  HARED lock in it
9390: 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74 20  s place if that 
93a0: 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  is.** the approp
93b0: 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64  riate thing to d
93c0: 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b  o.  Release lock
93d0: 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70  s usually is app
93e0: 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c  ropriate,.** unl
93f0: 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65 78  ess we are in ex
9400: 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20 6d  clusive access m
9410: 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68  ode or unless th
9420: 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d  is is a .** COMM
9430: 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20  IT AND BEGIN or 
9440: 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47  ROLLBACK AND BEG
9450: 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  IN operation..**
9460: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
9470: 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20 64  file is either d
9480: 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61  eleted or trunca
9490: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a  ted..**.** TODO:
94a0: 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e   Consider keepin
94b0: 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
94c0: 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70  le open for temp
94d0: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2e  orary databases.
94e0: 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67  .** This might g
94f0: 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63  ive a performanc
9500: 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e  e improvement on
9510: 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f   windows where o
9520: 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65  pening.** a file
9530: 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65   is an expensive
9540: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
9550: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9560: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
9570: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
9580: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
9590: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
95a0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20  OK;.  int rc2 = 
95b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
95c0: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
95d0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
95e0: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
95f0: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
9600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
9620: 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  tCommit(pPager);
9630: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
9640: 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67  tmtOpen && !pPag
9650: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9660: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
9670: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
9680: 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67  >stfd);.    pPag
9690: 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
96a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
96b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
96c0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
96d0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
96e0: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
96f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
9700: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
9710: 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f  fd, 0))==SQLITE_
9720: 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c  OK ){;.      sql
9730: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
9740: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
9750: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9760: 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
9770: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
9780: 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
9790: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
97a0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
97b0: 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
97c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
97d0: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Open = 0;.      
97e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
97f0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
9800: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
9810: 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
9820: 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  al);.      }.   
9830: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
9840: 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  e( pPager->aInJo
9850: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
9860: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
9870: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67  = 0;.    for(pPg
9880: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
9890: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
98a0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50  xtAll){.      pP
98b0: 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
98c0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
98d0: 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
98e0: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
98f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61  .      pPg->alwa
9900: 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a  ysRollback = 0;.
9910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9920: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
9930: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9940: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9950: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9960: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
9970: 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
9980: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
9990: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
99a0: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
99b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
99c0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
99d0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  nal==0 );.    as
99e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69  sert( pPager->di
99f0: 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70  rtyCache==0 || p
9a00: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
9a10: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  l==0 );.  }..  i
9a20: 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  f( !pPager->excl
9a30: 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20  usiveMode ){.   
9a40: 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73   rc2 = sqlite3Os
9a50: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
9a60: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
9a70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
9a80: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
9a90: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
9aa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
9ab0: 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20  GER_SYNCED ){.  
9ac0: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
9ad0: 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
9ae0: 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  E;.  }.  pPager-
9af0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
9b00: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
9b10: 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
9b20: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
9b30: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
9b40: 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
9b50: 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61  r->pFirst;.  pPa
9b60: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
9b70: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
9b80: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
9b90: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
9ba0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
9bb0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
9bc0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
9be0: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
9bf0: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
9c00: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
9c10: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
9c20: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
9c30: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
9c40: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
9c50: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
9c60: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
9c70: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
9c80: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
9c90: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
9ca0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
9cb0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
9cc0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
9cd0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
9ce0: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
9cf0: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
9d00: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
9d10: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
9d20: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
9d30: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
9d40: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
9d50: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
9d60: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
9d70: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
9d80: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
9d90: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
9da0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
9db0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
9dc0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
9dd0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
9de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
9df0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
9e00: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
9e10: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
9e20: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
9e30: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
9e40: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
9e50: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
9e60: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
9e70: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
9e80: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
9e90: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
9ea0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
9eb0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
9ec0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
9ed0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
9ee0: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
9ef0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
9f00: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
9f10: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
9f20: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
9f30: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
9f40: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
9f50: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
9f60: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
9f70: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
9f80: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
9f90: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
9fa0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
9fb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
9fc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
9fd0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
9fe0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
9ff0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a000: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
a010: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
a020: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
a030: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
a040: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
a050: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
a060: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
a070: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
a080: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
a090: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
a0a0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
a0b0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
a0c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
a0d0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
a0e0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a0f0: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
a100: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
a110: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
a120: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
a130: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
a140: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
a150: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
a160: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
a170: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
a180: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
a190: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
a1a0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
a1b0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
a1c0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
a1d0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
a1e0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
a1f0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a200: 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74  OsFile *jfd, int
a210: 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e   useCksum){.  in
a220: 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
a230: 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
a240: 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
a250: 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65  ting page in the
a260: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
a270: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
a280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a290: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
a2a0: 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61  a page in journa
a2b0: 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d  l */.  u32 cksum
a2c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a2d0: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
a2e0: 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79   used for sanity
a2f0: 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75   checking */.  u
a300: 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a  8 *aData = (u8 *
a310: 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  )pPager->pTmpSpa
a320: 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74  ce;   /* Temp st
a330: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
a340: 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73   */..  /* useCks
a350: 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  um should be tru
a360: 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a  e for the main j
a370: 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65  ournal and false
a380: 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d   for.  ** statem
a390: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56  ent journals.  V
a3a0: 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
a3b0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63 61  is always the ca
a3c0: 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  se.  */.  assert
a3d0: 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73  ( jfd == (useCks
a3e0: 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64  um ? pPager->jfd
a3f0: 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29   : pPager->stfd)
a400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44   );.  assert( aD
a410: 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72  ata );..  rc = r
a420: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
a430: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21  pgno);.  if( rc!
a440: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
a450: 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
a460: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64  qlite3OsRead(jfd
a470: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a480: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
a490: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a4a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
a4b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a4c0: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
a4d0: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
a4e0: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
a4f0: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
a500: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
a510: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
a520: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
a530: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
a540: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
a550: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a560: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
a570: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
a580: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
a590: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
a5a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
a5b0: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
a5c0: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
a5d0: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
a5e0: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
a5f0: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
a600: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
a610: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
a620: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
a630: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
a640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
a650: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
a660: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
a670: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
a680: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a690: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
a6a0: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
a6b0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
a6c0: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
a6d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
a6e0: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
a6f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
a700: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
a710: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44  cksum(pPager, aD
a720: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
a730: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a740: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
a750: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
a760: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
a770: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
a780: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a790: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a7a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
a7b0: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
a7c0: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
a7d0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
a7e0: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
a7f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
a800: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
a810: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
a820: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
a830: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
a840: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
a850: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
a860: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
a870: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
a880: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
a890: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
a8a0: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
a8b0: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
a8c0: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
a8d0: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
a8e0: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
a8f0: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
a900: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
a910: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
a920: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
a930: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
a940: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
a950: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
a960: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
a970: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
a980: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
a990: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
a9a0: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
a9b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
a9c0: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
a9d0: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
a9e0: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
a9f0: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
aa00: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
aa10: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
aa20: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
aa30: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
aa40: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
aa50: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
aa60: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
aa70: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
aa80: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
aa90: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
aaa0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
aab0: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
aac0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
aad0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
aae0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
aaf0: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ab00: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ab10: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
ab20: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
ab30: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
ab40: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
ab50: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
ab60: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
ab70: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
ab80: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
ab90: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
aba0: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
abb0: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
abc0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
abd0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
abe0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
abf0: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
ac00: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
ac10: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
ac20: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ac30: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ac40: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
ac50: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
ac60: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
ac70: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
ac80: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
ac90: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
aca0: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
acb0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
acc0: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
acd0: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
ace0: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
acf0: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
ad00: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
ad10: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
ad20: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
ad30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ad40: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
ad50: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
ad60: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
ad70: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
ad80: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ad90: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
ada0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
adb0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
adc0: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
add0: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ade0: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
adf0: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ae00: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
ae10: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70  ync==0..  */.  p
ae20: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
ae30: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
ae40: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
ae50: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
ae60: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
ae70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ae80: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
ae90: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
aea0: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
aeb0: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
aec0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
aed0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
aee0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
aef0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
af00: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
af10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
af20: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
af30: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
af40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
af50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
af60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
af70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
af80: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
af90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
afa0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
afb0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
afc0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
afd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
afe0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
aff0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
b000: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
b010: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
b020: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
b030: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
b040: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
b050: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
b060: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
b070: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
b080: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
b090: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
b0a0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
b0b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
b0c0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
b0d0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
b0e0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
b0f0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
b100: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
b110: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
b120: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
b130: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
b140: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
b150: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
b160: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
b170: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
b180: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
b190: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
b1a0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
b1b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
b1c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
b1d0: 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70  niter ){.      p
b1e0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
b1f0: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
b200: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
b210: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
b220: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
b230: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
b240: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
b250: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
b260: 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
b270: 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
b280: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
b290: 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
b2a0: 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
b2b0: 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
b2c0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
b2d0: 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
b2e0: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
b2f0: 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
b300: 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
b310: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
b320: 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
b330: 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
b340: 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
b350: 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
b360: 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
b370: 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
b380: 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72  gno, 3);.  }.  r
b390: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
b3a0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
b3b0: 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
b3c0: 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
b3d0: 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
b3e0: 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
b3f0: 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
b400: 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
b410: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
b420: 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
b430: 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
b440: 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
b450: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
b460: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
b470: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b480: 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
b490: 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
b4a0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
b4b0: 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61  urnal file conta
b4c0: 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ins the names of
b4d0: 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e   all child journ
b4e0: 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20  als..** To tell 
b4f0: 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  if a master jour
b500: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
b510: 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63  ed, check to eac
b520: 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c  h of the.** chil
b530: 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68  dren.  If all ch
b540: 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65  ildren are eithe
b550: 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20  r missing or do 
b560: 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20  not refer to.** 
b570: 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74  a different mast
b580: 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e  er journal, then
b590: 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75   this master jou
b5a0: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
b5b0: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
b5c0: 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74  nt pager_delmast
b5d0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
b5e0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
b5f0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
b600: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69  open = 0;.  OsFi
b610: 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a  le *master = 0;.
b620: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
b630: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
b640: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
b650: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
b660: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
b670: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
b680: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
b690: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
b6a0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
b6b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
b6c0: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
b6d0: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
b6e0: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
b6f0: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
b700: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
b710: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
b720: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
b730: 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ce..  */.  rc = 
b740: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
b750: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
b760: 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72  master);.  asser
b770: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
b780: 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a 20 20   || master );.  
b790: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b7a0: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b7b0: 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72  er_out;.  master
b7c0: 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20  _open = 1;.  rc 
b7d0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b7e0: 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61  ize(master, &nMa
b7f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
b800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b810: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
b820: 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
b830: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
b840: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
b850: 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
b860: 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
b870: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
b880: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
b890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
b8a0: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
b8b0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
b8c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
b8d0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
b8e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20  asterJournal. . 
b8f0: 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65     */.    zMaste
b900: 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72  rJournal = (char
b910: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
b920: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
b930: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
b940: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
b950: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
b960: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
b970: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
b980: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
b990: 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74  lite3OsRead(mast
b9a0: 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
b9b0: 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al, nMasterJourn
b9c0: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  al);.    if( rc!
b9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
b9e0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
b9f0: 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d  ..    zJournal =
ba00: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   zMasterJournal;
ba10: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f  .    while( (zJo
ba20: 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75  urnal-zMasterJou
ba30: 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75  rnal)<nMasterJou
ba40: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  rnal ){.      if
ba50: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
ba60: 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20  xists(zJournal) 
ba70: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ){.        /* On
ba80: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ba90: 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  s pointed to by 
baa0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
bab0: 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20  al exists..     
bac0: 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e     ** Open it an
bad0: 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f  d check if it po
bae0: 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74  ints at the mast
baf0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20  er journal. If. 
bb00: 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65         ** so, re
bb10: 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c  turn without del
bb20: 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  eting the master
bb30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20   journal file.. 
bb40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bb50: 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61    OsFile *journa
bb60: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  l = 0;.        i
bb70: 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  nt c;..        r
bb80: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
bb90: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
bba0: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
bbb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
bbc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
bbd0: 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  journal );.     
bbe0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bbf0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
bc00: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
bc10: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
bc20: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
bc30: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
bc40: 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65  journal, &zMaste
bc50: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
bc60: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a  qlite3OsClose(&j
bc70: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
bc80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bc90: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
bca0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
bcb0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
bcc0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
bcd0: 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72 63  erPtr!=0 && strc
bce0: 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
bcf0: 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
bd00: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
bd10: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
bd20: 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
bd30: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
bd40: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
bd50: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
bd60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bd70: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
bd80: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
bd90: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
bda0: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
bdb0: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
bdc0: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
bdd0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d   }.  }.  .  rc =
bde0: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
bdf0: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
be00: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
be10: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
be20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
be30: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
be40: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
be50: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
be60: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
be70: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
be80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
be90: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
bea0: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
beb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b  (Pager *pPager);
bec0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
bed0: 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f   the main file o
bee0: 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  f the given page
bef0: 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  r to the number 
bf00: 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69  of pages.** indi
bf10: 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e  cated. Also trun
bf20: 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20  cate the cached 
bf30: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
bf40: 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  f the file..*/.s
bf50: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bf60: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
bf70: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
bf80: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
bf90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
bfa0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
bfb0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
bfc0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
bfd0: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
bfe0: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
bff0: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
c000: 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Page);.  }.  if(
c010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c020: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
c030: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
c040: 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
c050: 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
c060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
c080: 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72  e sectorSize for
c090: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
c0a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74  ..**.** The sect
c0b0: 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c  or size is the l
c0c0: 61 72 67 65 72 20 6f 66 20 74 68 65 20 73 65 63  arger of the sec
c0d0: 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65  tor size reporte
c0e0: 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f  d.** by sqlite3O
c0f0: 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e  sSectorSize() an
c100: 64 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a  d the pageSize..
c110: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c120: 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67  etSectorSize(Pag
c130: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
c140: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
c150: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
c160: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
c170: 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  fd);.  if( pPage
c180: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70 50  r->sectorSize<pP
c190: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
c1a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65  {.    pPager->se
c1b0: 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67 65  ctorSize = pPage
c1c0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
c1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
c1e0: 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ck the journal a
c1f0: 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65 20  nd thus restore 
c200: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c210: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74  e to.** the stat
c220: 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f  e it was in befo
c230: 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d 61  re we started ma
c240: 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a  king changes.  .
c250: 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  **.** The journa
c260: 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73  l file format is
c270: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a   as follows: .**
c280: 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74 65  .**  (1)  8 byte
c290: 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79   prefix.  A copy
c2a0: 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69   of aJournalMagi
c2b0: 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20  c[]..**  (2)  4 
c2c0: 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
c2d0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c2e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
c2f0: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
c300: 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68  s.**       in th
c310: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74  e journal.  If t
c320: 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78 66  his value is 0xf
c330: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f  fffffff, then co
c340: 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20  mpute the.**    
c350: 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67     number of pag
c360: 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74  e records from t
c370: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e  he journal size.
c380: 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74 65  .**  (3)  4 byte
c390: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
c3a0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
c3b0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66   initial value f
c3c0: 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  or the .**      
c3d0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d   sanity checksum
c3e0: 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74  ..**  (4)  4 byt
c3f0: 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
c400: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c410: 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61   pages to trunca
c420: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
c430: 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72 69  database to duri
c440: 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  ng a rollback..*
c450: 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20 69  *  (5)  4 byte i
c460: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
c470: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
c480: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
c490: 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  r journal.**    
c4a0: 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61     name.  The va
c4b0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20  lue may be zero 
c4c0: 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74  (indicate that t
c4d0: 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65  here is no maste
c4e0: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
c4f0: 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20  al.).**  (6)  N 
c500: 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73  bytes of the mas
c510: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
c520: 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c  .  The name will
c530: 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74   be nul-terminat
c540: 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20  ed.**       and 
c550: 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65 72  might be shorter
c560: 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20   than the value 
c570: 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20  read from (5).  
c580: 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  If the first byt
c590: 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  e.**       of th
c5a0: 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74  e name is \000 t
c5b0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
c5c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
c5d0: 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20   The master.**  
c5e0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d       journal nam
c5f0: 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55  e is stored in U
c600: 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a  TF-8..**  (7)  Z
c610: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  ero or more page
c620: 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63  s instances, eac
c630: 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  h as follows:.**
c640: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
c650: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  e page number..*
c660: 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61 67  *        +  pPag
c670: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
c680: 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20  es of data..**  
c690: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
c6a0: 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57  checksum.**.** W
c6b0: 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20  hen we speak of 
c6c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
c6d0: 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20  er, we mean the 
c6e0: 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61 62  first 6 items ab
c6f0: 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74  ove..** Each ent
c700: 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ry in the journa
c710: 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  l is an instance
c720: 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65 6d   of the 7th item
c730: 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  ..**.** Call the
c740: 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20   value from the 
c750: 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e  second bullet "n
c760: 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74  Rec".  nRec is t
c770: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
c780: 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69  valid page entri
c790: 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  es in the journa
c7a0: 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65  l.  In most case
c7b0: 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75  s, you can compu
c7c0: 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  te the.** value 
c7d0: 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65  of nRec from the
c7e0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c7f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20  rnal file.  But 
c800: 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61  if a power.** fa
c810: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20 77  ilure occurred w
c820: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
c830: 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74 74   was being writt
c840: 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20  en, it could be 
c850: 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74  the.** case that
c860: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c870: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
c880: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  d already been i
c890: 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20  ncreased but.** 
c8a0: 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69 65  the extra entrie
c8b0: 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61  s had not yet ma
c8c0: 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20  de it safely to 
c8d0: 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61  disk.  In such a
c8e0: 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61   case,.** the va
c8f0: 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70  lue of nRec comp
c900: 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69  uted from the fi
c910: 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65  le size would be
c920: 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72   too large.  For
c930: 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c  .** that reason,
c940: 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
c950: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
c960: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
c970: 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20 76  ** If the nRec v
c980: 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
c990: 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  ff it means that
c9a0: 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20   nRec should be 
c9b0: 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d  computed.** from
c9c0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20   the file size. 
c9d0: 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20 75   This value is u
c9e0: 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73 65  sed when the use
c9f0: 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a  r selects the.**
ca00: 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20   no-sync option 
ca10: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  for the journal.
ca20: 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72    A power failur
ca30: 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  e could lead to 
ca40: 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e  corruption.** in
ca50: 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75 74   this case.  But
ca60: 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65   for things like
ca70: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
ca80: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a   (which will be.
ca90: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
caa0: 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65 73  the power is res
cab0: 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20  tored) we don't 
cac0: 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  care.  .**.** If
cad0: 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
cae0: 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   as the journal 
caf0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65  file is not a we
cb00: 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75  ll-formed.** jou
cb10: 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61  rnal file then a
cb20: 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20 74  ll pages up to t
cb30: 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70 74  he first corrupt
cb40: 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c  ed page are roll
cb50: 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e  ed.** back (or n
cb60: 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a  o pages if the j
cb70: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
cb80: 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65   corrupted). The
cb90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
cba0: 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64   is then deleted
cbb0: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
cbc0: 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73  eturned, just as
cbd0: 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f   if no corruptio
cbe0: 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e  n had.** been en
cbf0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a  countered..**.**
cc00: 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61   If an I/O or ma
cc10: 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63  lloc() error occ
cc20: 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  urs, the journal
cc30: 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c  -file is not del
cc40: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  eted.** and an e
cc50: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
cc60: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
cc70: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
cc80: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
cc90: 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20  r, int isHot){. 
cca0: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
ccb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
ccc0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ccd0: 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a   file in bytes *
cce0: 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20  /.  u32 nRec;   
ccf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd00: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
cd10: 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s in the journal
cd20: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cd40: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
cd50: 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
cd60: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
cd70: 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
cd80: 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
cd90: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
cda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdb0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
cdc0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
cdd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  */.  char *zMast
cde0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  er = 0;       /*
cdf0: 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20   Name of master 
ce00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
ce10: 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  any */..  /* Fig
ce20: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
ce30: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
ce40: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
ce50: 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
ce60: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
ce70: 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
ce80: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
ce90: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
cea0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ceb0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
cec0: 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
ced0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
cee0: 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
cef0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
cf00: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
cf10: 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
cf20: 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
cf30: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
cf40: 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
cf50: 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
cf60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
cf70: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
cf80: 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
cf90: 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
cfa0: 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
cfb0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
cfc0: 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
cfd0: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
cfe0: 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
cff0: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d   */.  rc = readM
d000: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
d010: 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74  ger->jfd, &zMast
d020: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
d030: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d040: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
d050: 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65  TE_OK || (zMaste
d060: 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46  r && !sqlite3OsF
d070: 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65  ileExists(zMaste
d080: 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r)) ){.    sqlit
d090: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
d0a0: 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
d0b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d0c0: 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20  ITE_DONE ) rc = 
d0d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
d0e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d0f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
d100: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
d110: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
d120: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
d130: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
d140: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
d150: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
d160: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
d170: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
d180: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
d190: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
d1a0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
d1b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
d1c0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
d1d0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
d1e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
d1f0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
d200: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
d210: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
d220: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
d230: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
d240: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
d250: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
d260: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
d270: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
d280: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
d290: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
d2a0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
d2b0: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
d2c0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
d2d0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
d2e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d2f0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
d300: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
d310: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
d320: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
d330: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
d340: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
d350: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
d360: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
d370: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
d380: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
d390: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
d3a0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
d3b0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
d3c0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
d3d0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
d3e0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
d3f0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
d400: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
d410: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
d420: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
d430: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
d440: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
d450: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
d460: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
d470: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
d480: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
d490: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
d4a0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
d4b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
d4c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
d4d0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
d4e0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
d4f0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
d500: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d510: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
d520: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
d530: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
d540: 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68 69  Rec is 0 and thi
d550: 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66  s rollback is of
d560: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63   a transaction c
d570: 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a 20  reated by this. 
d580: 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49     ** process. I
d590: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
d5a0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
d5b0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73 74  nal file consist
d5c0: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72  s of.    ** jour
d5d0: 6e 61 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f 66  nalled copies of
d5e0: 20 70 61 67 65 73 20 74 68 61 74 20 6e 65 65 64   pages that need
d5f0: 20 74 6f 20 62 65 20 72 65 61 64 20 62 61 63 6b   to be read back
d600: 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 2e   into the cache.
d610: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d620: 6e 52 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f  nRec==0 && !isHo
d630: 74 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  t ){.      nRec 
d640: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d650: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a  >journalOff) / J
d660: 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
d670: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ger);.    }..   
d680: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
d690: 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20  he first header 
d6a0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
d6b0: 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20  urnal, truncate 
d6c0: 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
d6d0: 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f  ase file back to
d6e0: 20 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73   it's original s
d6f0: 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
d700: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
d710: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
d720: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
d730: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
d740: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
d750: 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
d760: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d770: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
d780: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d790: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d7a0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
d7b0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d7c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
d7d0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
d7e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
d7f0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
d800: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
d810: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
d820: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d830: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d840: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d850: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d860: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d870: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
d880: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
d890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d8a0: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
d8b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
d8c0: 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
d8d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
d8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
d8f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
d900: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d910: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d920: 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
d930: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
d940: 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
d950: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d960: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
d970: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
d980: 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  on(pPager);.  }.
d990: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
d9a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
d9b0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
d9c0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
d9d0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
d9e0: 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
d9f0: 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
da00: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
da10: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
da20: 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
da30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
da40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
da50: 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  = pager_delmaste
da60: 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  r(zMaster);.    
da70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  }.    sqliteFree
da80: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a  (zMaster);.  }..
da90: 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
daa0: 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
dab0: 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
dac0: 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
dad0: 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
dae0: 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
daf0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
db00: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
db10: 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
db20: 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
db30: 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
db40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
db50: 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
db60: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
db70: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
db80: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
db90: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
dba0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
dbb0: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
dbc0: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
dbd0: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
dbe0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
dbf0: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
dc00: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
dc10: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
dc20: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
dc30: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
dc40: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
dc50: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
dc60: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
dc70: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
dc80: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
dc90: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
dca0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
dcb0: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
dcc0: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
dcd0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dce0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
dcf0: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
dd00: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
dd10: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
dd20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
dd30: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
dd40: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
dd50: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
dd60: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
dd70: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
dd80: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
dd90: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
dda0: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
ddb0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
ddc0: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
ddd0: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
dde0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
de00: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
de10: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de30: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
de40: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
de50: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
de60: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
de70: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
de80: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
de90: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
dea0: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
deb0: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
dec0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ded0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
dee0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
def0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
df00: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
df10: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
df20: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
df30: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
df40: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
df50: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
df60: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
df70: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
df80: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
df90: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
dfa0: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
dfb0: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
dfc0: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
dfd0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
dfe0: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
dff0: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
e000: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
e010: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
e020: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
e030: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
e040: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
e050: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
e060: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
e070: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
e080: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
e090: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
e0a0: 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
e0b0: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
e0c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
e0d0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e);.  assert( pP
e0e0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
e0f0: 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
e100: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
e110: 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
e120: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
e130: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a  ent journal..  *
e140: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
e150: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
e160: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e170: 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65  Open );.  sqlite
e180: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
e190: 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63  stfd, 0);.  nRec
e1a0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e   = pPager->stmtN
e1b0: 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70  Rec;.  .  /* Cop
e1c0: 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
e1d0: 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74   out of the stat
e1e0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e  ement journal an
e1f0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a  d back into the.
e200: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
e210: 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  le.  Note that t
e220: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
e230: 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b  rnal omits check
e240: 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65  sums from.  ** e
e250: 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65  ach record since
e260: 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72   power-failure r
e270: 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69  ecovery is not i
e280: 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74  mportant to stat
e290: 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ement.  ** journ
e2a0: 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  als..  */.  for(
e2b0: 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20  i=nRec-1; i>=0; 
e2c0: 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  i--){.    rc = p
e2d0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
e2e0: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
e2f0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
e300: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e310: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e320: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e330: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
e340: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e350: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
e360: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
e370: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
e380: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
e390: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
e3a0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
e3b0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
e3c0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
e3d0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
e3e0: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
e3f0: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
e400: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
e410: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
e420: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
e430: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
e440: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
e450: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
e460: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
e470: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
e480: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
e490: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
e4a0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
e4b0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
e4c0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
e4d0: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
e4e0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
e4f0: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
e500: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
e510: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
e520: 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
e530: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e540: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
e550: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
e560: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a  .  }.  pPager->j
e570: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67  ournalOff = pPag
e580: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20  er->stmtJSize;. 
e590: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
e5a0: 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  it = pPager->stm
e5b0: 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28  tCksum;.  while(
e5c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e5d0: 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a  Off < hdrOff ){.
e5e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
e5f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
e600: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
e610: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
e620: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e630: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
e640: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e650: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
e660: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
e670: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
e680: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
e690: 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63  ){.    u32 nJRec
e6a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
e6b0: 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52  ber of Journal R
e6c0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33  ecords */.    u3
e6d0: 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20  2 dummy;.    rc 
e6e0: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
e6f0: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
e700: 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  JRec, &dummy);. 
e710: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e720: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
e730: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
e740: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
e750: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
e760: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
e770: 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b   if( nJRec==0 ){
e780: 0a 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28  .      nJRec = (
e790: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
e7a0: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61  urnalOff) / (pPa
e7b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
e7c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
e7d0: 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20  i=nJRec-1; i>=0 
e7e0: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
e7f0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d  alOff < szJ; i--
e800: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
e810: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
e820: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
e830: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
e840: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
e850: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
e860: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
e870: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
e880: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
e890: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
e8a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e8b0: 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f  f = szJ;.  .end_
e8c0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  stmt_playback:. 
e8d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e8e0: 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72  OK) {.    pPager
e8f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
e900: 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72  zJ;.    /* pager
e910: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
e920: 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20  ager); */.  }.  
e930: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e940: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d  .** Change the m
e950: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
e960: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
e970: 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65   that are allowe
e980: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
e990: 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
e9a0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
e9b0: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
e9c0: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
e9d0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
e9e0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
e9f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
ea00: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
ea10: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
ea20: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
ea30: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
ea40: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
ea50: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
ea60: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
ea70: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
ea80: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
ea90: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
eaa0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
eab0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
eac0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
ead0: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
eae0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
eaf0: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
eb00: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
eb10: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
eb20: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
eb30: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
eb40: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
eb50: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
eb60: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
eb70: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
eb80: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
eb90: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
ebb0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
ebc0: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
ebd0: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
ebe0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
ebf0: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
ec00: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
ec10: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
ec20: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
ec30: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
ec40: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
ec50: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
ec60: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
ec70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
ec80: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
ec90: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
eca0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
ecb0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
ecc0: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
ecd0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
ece0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
ecf0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
ed00: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
ed10: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
ed20: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
ed30: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
ed40: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
ed50: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
ed60: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
ed70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ed80: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
ed90: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
eda0: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
edb0: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
edc0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
edd0: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
ede0: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
edf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
ee00: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
ee10: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
ee20: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
ee30: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
ee40: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
ee50: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
ee60: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
ee70: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
ee90: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
eea0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
eeb0: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
eec0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
eed0: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
eee0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
eef0: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
ef00: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
ef10: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
ef20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ef30: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
ef40: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  S.void sqlite3Pa
ef50: 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65  gerSetSafetyLeve
ef60: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
ef70: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20   int level, int 
ef80: 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70  full_fsync){.  p
ef90: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
efa0: 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61   level==1 || pPa
efb0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
efc0: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
efd0: 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20  c = level==3 && 
efe0: 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
eff0: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  e;.  pPager->ful
f000: 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66  l_fsync = full_f
f010: 73 79 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67  sync;.  if( pPag
f020: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
f030: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
f040: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
f050: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f060: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
f070: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
f080: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
f090: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
f0a0: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
f0b0: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
f0c0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
f0d0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
f0e0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
f0f0: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
f100: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
f110: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
f120: 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
f130: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
f140: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
f150: 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
f160: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
f170: 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
f180: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
f190: 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
f1a0: 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
f1b0: 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
f1c0: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53  il..**.** The OS
f1d0: 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61   will automatica
f1e0: 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 74  lly delete the t
f1f0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68  emporary file wh
f200: 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73  en it is.** clos
f210: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
f220: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
f230: 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a  entemp(OsFile **
f240: 70 46 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  pFd){.  int cnt 
f250: 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 8;.  int rc;. 
f260: 20 63 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49   char zFile[SQLI
f270: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
f280: 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ];..#ifdef SQLIT
f290: 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33  E_TEST.  sqlite3
f2a0: 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b  _opentemp_count+
f2b0: 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20  +;  /* Used for 
f2c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
f2d0: 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e  ysis only */.#en
f2e0: 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  dif.  do{.    cn
f2f0: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
f300: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
f310: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
f320: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
f330: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46  lusive(zFile, pF
f340: 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72  d, 1);.    asser
f350: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
f360: 20 7c 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77   || *pFd );.  }w
f370: 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72  hile( cnt>0 && r
f380: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
f390: 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
f3a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f3b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
f3c0: 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68   a new page cach
f3d0: 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e  e and put a poin
f3e0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
f3f0: 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65  cache in *ppPage
f400: 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74  r..** The file t
f410: 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64  o be cached need
f420: 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65   not exist.  The
f430: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63   file is not loc
f440: 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65  ked until.** the
f450: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
f460: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
f470: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
f480: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
f490: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
f4a0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
f4b0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
f4c0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
f4d0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
f4e0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
f4f0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
f500: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
f510: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
f520: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
f530: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
f540: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
f550: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
f560: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
f570: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
f580: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
f590: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
f5a0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
f5b0: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
f5c0: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
f5d0: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
f5e0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
f5f0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
f600: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f610: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
f620: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
f630: 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
f640: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
f650: 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74 72  rn the Pager str
f660: 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
f670: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
f680: 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d  lename,   /* Nam
f690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
f6a0: 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
f6b0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f6d0: 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70 65  Extra bytes appe
f6e0: 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  nd to each in-me
f6f0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
f700: 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
f710: 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73          /* flags
f720: 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69   controlling thi
f730: 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50  s file */.){.  P
f740: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30  ager *pPager = 0
f750: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50  ;.  char *zFullP
f760: 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69  athname = 0;.  i
f770: 6e 74 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20  nt nameLen;  /* 
f780: 43 6f 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e  Compiler is wron
f790: 67 2e 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  g. This is alway
f7a0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65  s initialized be
f7b0: 66 6f 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73  fore use */.  Os
f7c0: 46 69 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20  File *fd = 0;.  
f7d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
f7e0: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
f7f0: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
f800: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
f810: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
f820: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
f830: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
f840: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
f850: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
f860: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
f870: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
f880: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
f890: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
f8a0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
f8b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f8c0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
f8d0: 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
f8e0: 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
f8f0: 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
f900: 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
f910: 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
f920: 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
f930: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
f940: 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
f950: 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
f960: 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
f970: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
f980: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
f990: 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
f9a0: 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
f9b0: 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
f9c0: 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
f9d0: 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
f9e0: 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62   set. It would b
f9f0: 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74  e nice to assert
fa00: 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61  .  ** that Threa
fa10: 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20  dData.nAlloc is 
fa20: 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c  non-zero, but al
fa30: 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20 74  as this breaks t
fa40: 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20  est cases .  ** 
fa50: 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b  written to invok
fa60: 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72 65  e the pager dire
fa70: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72  ctly..  */.  Thr
fa80: 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
fa90: 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
faa0: 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
fab0: 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd );.#endif.. 
fac0: 20 2f 2a 20 57 65 20 75 73 65 64 20 74 6f 20 74   /* We used to t
fad0: 65 73 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  est if malloc() 
fae0: 68 61 64 20 61 6c 72 65 61 64 79 20 66 61 69 6c  had already fail
faf0: 65 64 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65  ed before procee
fb00: 64 69 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20  ding. .  ** But 
fb10: 74 68 65 20 77 61 79 20 74 68 69 73 20 66 75 6e  the way this fun
fb20: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
fb30: 20 53 51 4c 69 74 65 20 6d 65 61 6e 73 20 74 68   SQLite means th
fb40: 61 74 20 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a  at can never.  *
fb50: 2a 20 68 61 70 70 65 6e 2e 20 46 75 72 74 68 65  * happen. Furthe
fb60: 72 6d 6f 72 65 2c 20 69 66 20 74 68 65 20 6d 61  rmore, if the ma
fb70: 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67  lloc-failed flag
fb80: 20 69 73 20 61 6c 72 65 61 64 79 20 73 65 74 2c   is already set,
fb90: 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 74 68   .  ** either th
fba0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
fbb0: 53 74 72 44 75 70 28 29 20 6f 72 20 73 71 6c 69  StrDup() or sqli
fbc0: 74 65 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77  teMalloc() below
fbd0: 20 77 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20   will.  ** fail 
fbe0: 73 68 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c 49  shortly and SQLI
fbf0: 54 45 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65  TE_NOMEM returne
fc00: 64 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20  d anyway..  */. 
fc10: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a   *ppPager = 0;..
fc20: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61    /* Open the pa
fc30: 67 65 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ger file and set
fc40: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74   zFullPathname t
fc50: 6f 20 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f  o point at mallo
fc60: 63 28 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f  c()ed .  ** memo
fc70: 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ry containing th
fc80: 65 20 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e  e complete filen
fc90: 61 6d 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64  ame (i.e. includ
fca0: 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
fcb0: 79 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  y)..  */.  if( z
fcc0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
fcd0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
fce0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fcf0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
fd00: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
fd10: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
fd20: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
fd30: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
fd40: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
fd50: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
fd60: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
fd70: 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50    {.      zFullP
fd80: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
fd90: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
fda0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
fdb0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
fdc0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ame ){.        r
fdd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
fde0: 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c  nReadWrite(zFull
fdf0: 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26  Pathname, &fd, &
fe00: 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20  readOnly);.     
fe10: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
fe20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20 29  QLITE_OK || fd )
fe30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fe40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
fe50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
fe60: 65 6e 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20  entemp(&fd);.   
fe70: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
fe80: 6c 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20  leName(zTemp);. 
fe90: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
fea0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
feb0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
fec0: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
fed0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
fee0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
fef0: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
ff00: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
ff10: 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
ff20: 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
ff30: 63 74 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f  cture. As part o
ff40: 66 20 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63  f the same alloc
ff50: 61 74 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a  ation, allocate.
ff60: 20 20 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74    ** space for t
ff70: 68 65 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66  he full paths of
ff80: 20 74 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63   the file, direc
ff90: 74 6f 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  tory and journal
ffa0: 20 0a 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46   .  ** (Pager.zF
ffb0: 69 6c 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a  ilename, Pager.z
ffc0: 44 69 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61  Directory and Pa
ffd0: 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20  ger.zJournal).. 
ffe0: 20 2a 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50   */.  if( zFullP
fff0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e  athname ){.    n
10000 61 6d 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  ameLen = strlen(
10010 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10020 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
10030 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
10040 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d  f(*pPager) + nam
10050 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20  eLen*3 + 30 );. 
10060 20 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26     if( pPager &&
10070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10080 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10090 70 54 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61  pTmpSpace = (cha
100a0 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
100b0 52 61 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55  Raw(SQLITE_DEFAU
100c0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20  LT_PAGE_SIZE);. 
100d0 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
100e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
100f0 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66  red in either of
10100 20 74 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76   the blocks abov
10110 65 2c 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f  e, free the memo
10120 72 79 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64  ry .  ** pointed
10130 20 74 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68   to by zFullPath
10140 6e 61 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50  name, free the P
10150 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
10160 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20  nd close the .  
10170 2a 2a 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74  ** file. Since t
10180 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
10190 61 6c 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20  allocated there 
101a0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65  is no need to se
101b0 74 20 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65  t .  ** any Page
101c0 72 2e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62  r.errMask variab
101d0 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
101e0 21 70 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c  !pPager || !zFul
101f0 6c 50 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50  lPathname || !pP
10200 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
10210 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
10220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
10230 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
10240 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
10250 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
10260 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
10270 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  r);.    return (
10280 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f  (rc==SQLITE_OK)?
10290 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29  SQLITE_NOMEM:rc)
102a0 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
102b0 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
102c0 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
102d0 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
102e0 6e 61 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45  name);.  IOTRACE
102f0 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22  (("OPEN %p %s\n"
10300 2c 20 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50  , pPager, zFullP
10310 61 74 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67  athname)).  pPag
10320 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
10330 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
10340 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
10350 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
10360 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
10370 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
10380 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
10390 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
103a0 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
103b0 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
103c0 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
103d0 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e  athname, nameLen
103e0 2b 31 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50  +1);.  memcpy(pP
103f0 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
10400 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , zFullPathname,
10410 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20   nameLen+1);..  
10420 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
10430 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
10440 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
10450 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
10460 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
10470 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
10480 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   0;.  memcpy(pPa
10490 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
104a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 61 6d  FullPathname,nam
104b0 65 4c 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46  eLen);.  sqliteF
104c0 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
104d0 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
104e0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
104f0 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
10500 61 6c 22 2c 73 69 7a 65 6f 66 28 22 2d 6a 6f 75  al",sizeof("-jou
10510 72 6e 61 6c 22 29 29 3b 0a 20 20 70 50 61 67 65  rnal"));.  pPage
10520 72 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a  r->fd = fd;.  /*
10530 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10540 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Open = 0; */.  p
10550 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
10560 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
10570 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
10580 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
10590 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
105a0 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50  eadOnly;.  /* pP
105b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
105c0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
105d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
105e0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
105f0 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a  r->nRef = 0; */.
10600 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
10610 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50   = memDb-1;.  pP
10620 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
10630 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10640 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20  PAGE_SIZE;.  /* 
10650 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
10660 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50   = 0; */.  /* pP
10670 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
10680 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10690 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20  ger->nPage = 0; 
106a0 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  */.  pPager->mxP
106b0 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
106c0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51  ger->mxPgno = SQ
106d0 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f  LITE_MAX_PAGE_CO
106e0 55 4e 54 3b 0a 20 20 61 73 73 65 72 74 28 20 50  UNT;.  assert( P
106f0 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29  AGER_UNLOCK==0 )
10700 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
10710 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
10720 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
10730 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
10740 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
10750 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
10760 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
10770 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
10780 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
10790 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
107a0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
107b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
107c0 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
107d0 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
107e0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
107f0 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
10800 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
10810 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
10820 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
10830 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
10840 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
10850 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
10860 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
10870 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
10880 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
10890 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
108a0 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
108b0 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
108c0 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
108d0 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
108e0 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
108f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10900 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
10910 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
10920 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
10930 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
10940 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
10950 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c  );.  assert(fd||
10960 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d  memDb);.  if( !m
10970 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53  emDb ){.    setS
10980 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
10990 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67  );.  }.  /* pPag
109a0 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
109b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65   = 0; */.  /* me
109c0 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
109d0 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
109e0 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a  ager->aHash)); *
109f0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70  /.  *ppPager = p
10a00 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51  Pager;.#ifdef SQ
10a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
10a20 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
10a30 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
10a40 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20  pTsd->pPager;.  
10a50 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
10a60 50 61 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20  Pager;.#endif.  
10a70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10a90 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
10aa0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
10ab0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
10ac0 74 42 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  tBusyhandler(Pag
10ad0 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
10ae0 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
10af0 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
10b00 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
10b10 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
10b20 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
10b30 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
10b40 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
10b50 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
10b60 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
10b70 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
10b80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
10b90 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
10ba0 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
10bb0 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
10bc0 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
10bd0 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
10be0 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
10bf0 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
10c00 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
10c10 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
10c20 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
10c30 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
10c40 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20  e3PagerClose(). 
10c50 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73   .** Destructors
10c60 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64   are only called
10c70 20 62 79 20 73 71 6c 69 74 65 33 50 61 67 65 72   by sqlite3Pager
10c80 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  Unref()..*/.void
10c90 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
10ca0 44 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  Destructor(Pager
10cb0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
10cc0 2a 78 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c  *xDesc)(DbPage*,
10cd0 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
10ce0 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
10cf0 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
10d00 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
10d10 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
10d20 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
10d30 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
10d40 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
10d50 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
10d60 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
10d70 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
10d80 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
10d90 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
10da0 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
10db0 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
10dc0 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
10dd0 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
10de0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
10df0 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
10e00 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
10e10 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
10e20 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
10e30 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
10e40 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
10e50 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
10e60 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
10e70 74 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  t)(DbPage*,int))
10e80 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
10e90 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
10ea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
10eb0 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
10ec0 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
10ed0 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
10ee0 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
10ef0 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
10f00 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
10f10 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
10f20 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
10f30 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
10f40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
10f50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
10f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10f70 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20  nt pageSize){.  
10f80 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
10f90 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
10fa0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
10fb0 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28  GE_SIZE );.  if(
10fc0 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
10fd0 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
10fe0 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f  =0 ){.    pager_
10ff0 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
11000 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
11010 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
11020 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
11030 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 52  Space = sqlite3R
11040 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61  eallocOrFree(pPa
11050 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  ger->pTmpSpace, 
11060 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  pageSize);.  }. 
11070 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11080 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
11090 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
110a0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
110b0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
110c0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
110d0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
110e0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
110f0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
11100 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
11110 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
11120 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
11130 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
11140 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
11150 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
11160 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
11170 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
11180 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
11190 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
111a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
111b0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
111c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
111d0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
111e0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
111f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
11200 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
11210 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
11220 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11230 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
11240 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
11250 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
11260 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
11270 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
11280 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
11290 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
112a0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
112b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
112c0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
112d0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
112e0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
112f0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
11300 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
11310 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
11320 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
11330 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
11340 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
11350 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
11360 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
11370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
11380 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
11390 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
113a0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
113b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
113c0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
113d0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
113e0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
113f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11400 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
11410 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
11420 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
11430 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11440 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
11450 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
11460 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
11470 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
11480 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
11490 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
114a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
114b0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
114c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
114d0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
114e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
114f0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
11500 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
11510 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
11520 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
11530 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
11540 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
11550 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
11560 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
11570 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
11580 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
11590 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
115a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
115b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
115c0 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
115d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
115e0 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
115f0 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
11600 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
11610 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
11620 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
11630 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
11640 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
11650 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
11660 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
11670 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
11680 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
11690 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
116a0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
116b0 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
116c0 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
116d0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
116e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
116f0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
11700 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
11710 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
11720 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
11730 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
11740 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
11750 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d  N);.  if( MEMDB=
11760 3d 30 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c  =0 ){.    disabl
11770 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11780 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c  rrors();.    sql
11790 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
117a0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 65  r->fd, 0);.    e
117b0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
117c0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
117d0 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44 52   IOTRACE(("DBHDR
117e0 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61   %p 0 %d\n", pPa
117f0 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20  ger, N)).    rc 
11800 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
11810 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73  pPager->fd, pDes
11820 74 2c 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72  t, N);.    if( r
11830 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
11840 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
11850 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11860 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
11870 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11880 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
11890 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
118a0 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
118b0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
118c0 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
118d0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
118e0 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
118f0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
11900 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
11910 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
11920 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
11930 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
11940 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
11950 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
11960 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
11970 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
11980 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
11990 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
119a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
119b0 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
119c0 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
119d0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
119e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
119f0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
11a00 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
11a10 69 36 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  i64 n;.  int rc;
11a20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11a30 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  r!=0 );.  if( pP
11a40 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
11a50 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
11a60 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
11a70 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
11a80 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62    n = pPager->db
11a90 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  Size;.  } else {
11aa0 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20 73  .    if( (rc = s
11ab0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
11ac0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  (pPager->fd, &n)
11ad0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
11ae0 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
11af0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
11b00 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
11b10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
11b20 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
11b30 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
11b40 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
11b50 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
11b60 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
11b70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
11b80 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
11b90 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
11ba0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
11bb0 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
11bc0 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
11bd0 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
11be0 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
11bf0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
11c00 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
11c10 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
11c20 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
11c30 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
11c40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11c50 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
11c60 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
11c70 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
11c80 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
11c90 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
11ca0 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
11cb0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
11cc0 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
11cd0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
11ce0 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
11cf0 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
11d00 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
11d10 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
11d20 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
11d30 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64  ./*.** Forward d
11d40 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74  eclaration.*/.st
11d50 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
11d60 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f  rnal(Pager*);../
11d70 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
11d80 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
11d90 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
11da0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
11db0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
11dc0 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
11dd0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
11de0 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
11df0 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
11e00 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
11e10 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
11e20 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63  page() routine c
11e30 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20  an leave a page 
11e40 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74  in the .** pNext
11e50 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c  Free/pPrevFree l
11e60 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ist that is not 
11e70 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  a part of any ha
11e80 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  sh-chain..*/.sta
11e90 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48  tic void unlinkH
11ea0 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a  ashChain(Pager *
11eb0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
11ec0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
11ed0 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61  pgno==0 ){.    a
11ee0 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
11ef0 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
11f00 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
11f10 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11f20 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11f30 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
11f40 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
11f50 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
11f60 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
11f70 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
11f80 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
11f90 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
11fa0 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67  Pg->pgno & (pPag
11fb0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70  er->nHash-1)]!=p
11fc0 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
11fd0 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
11fe0 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
11ff0 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
12000 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e     int h = pPg->
12010 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
12020 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50  nHash-1);.    pP
12030 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d  ager->aHash[h] =
12040 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b   pPg->pNextHash;
12050 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
12060 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73   ){.    clearHis
12070 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49  tory(PGHDR_TO_HI
12080 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29  ST(pPg, pPager))
12090 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e  ;.  }.  pPg->pgn
120a0 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e  o = 0;.  pPg->pN
120b0 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
120c0 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a  PrevHash = 0;.}.
120d0 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20  ./*.** Unlink a 
120e0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
120f0 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73  ee list (the lis
12100 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77  t of all pages w
12110 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a  here nRef==0).**
12120 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61   and from its ha
12130 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61  sh collision cha
12140 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
12150 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67  id unlinkPage(Pg
12160 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
12170 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
12180 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
12190 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53  Keep the pFirstS
121a0 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  ynced pointer po
121b0 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69  inting at the fi
121c0 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  rst synchronized
121d0 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
121e0 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg==pPager->pFir
121f0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
12200 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
12210 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77  pNextFree;.    w
12220 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65  hile( p && p->ne
12230 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d  edSync ){ p = p-
12240 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20  >pNextFree; }.  
12250 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
12260 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a  Synced = p;.  }.
12270 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
12280 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  m the freelist *
12290 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  /.  if( pPg->pPr
122a0 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  evFree ){.    pP
122b0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
122c0 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
122d0 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73  NextFree;.  }els
122e0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
122f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70  Pager->pFirst==p
12300 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
12310 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e  ->pFirst = pPg->
12320 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20  pNextFree;.  }. 
12330 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12340 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
12350 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
12360 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
12370 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  vFree;.  }else{.
12380 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12390 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29  er->pLast==pPg )
123a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
123b0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
123c0 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  Free;.  }.  pPg-
123d0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
123e0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b  ->pPrevFree = 0;
123f0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
12400 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68  om the pgno hash
12410 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69   table */.  unli
12420 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
12430 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  er, pPg);.}../*.
12440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12450 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
12460 61 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68  ate the cache wh
12470 65 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  en a database.**
12480 20 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20   is truncated.  
12490 44 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61  Drop from the ca
124a0 63 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68  che all pages wh
124b0 6f 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c  ose pgno is.** l
124c0 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65  arger than pPage
124d0 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73  r->dbSize and is
124e0 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a   unreferenced..*
124f0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20  *.** Referenced 
12500 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61  pages larger tha
12510 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
12520 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
12530 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20  ** Actually, at 
12540 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72  the point this r
12550 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12560 2c 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a  , it would be.**
12570 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76   an error to hav
12580 65 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70  e a referenced p
12590 61 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72  age.  But rather
125a0 20 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20   than delete.** 
125b0 74 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75  that page and gu
125c0 61 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71  arantee a subseq
125d0 75 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69  uent segfault, i
125e0 74 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a  t seems better.*
125f0 2a 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64  * to zero it and
12600 20 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72   hope that we er
12610 72 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a  ror out sanely..
12620 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
12630 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
12640 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
12650 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
12660 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67  ;.  PgHdr **ppPg
12670 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d  ;.  int dbSize =
12680 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
12690 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67  ..  ppPg = &pPag
126a0 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c  er->pAll;.  whil
126b0 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29  e( (pPg = *ppPg)
126c0 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  !=0 ){.    if( p
126d0 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65  Pg->pgno<=dbSize
126e0 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d   ){.      ppPg =
126f0 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
12700 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
12710 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20  Pg->nRef>0 ){.  
12720 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
12730 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
12740 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
12750 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20  ze);.      ppPg 
12760 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
12770 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12780 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e     *ppPg = pPg->
12790 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
127a0 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
127b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
127c0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
127d0 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
127e0 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
127f0 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
12800 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
12810 50 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43  Pg);.      makeC
12820 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20  lean(pPg);.     
12830 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29   sqliteFree(pPg)
12840 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
12850 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20  nPage--;.    }. 
12860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20   }.}../*.** Try 
12870 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
12880 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76   on a file.  Inv
12890 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c  oke the busy cal
128a0 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63  lback if the loc
128b0 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  k.** is currentl
128c0 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  y not available.
128d0 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74    Repeat until t
128e0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
128f0 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73   returns.** fals
12900 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c  e or until the l
12910 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a  ock succeeds..**
12920 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
12930 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
12940 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
12950 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f  e if we cannot o
12960 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63  btain.** the loc
12970 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
12980 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
12990 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
129a0 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  r, int locktype)
129b0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
129c0 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61  * The OS lock va
129d0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65  lues must be the
129e0 20 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67   same as the Pag
129f0 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a  er lock values *
12a00 2f 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  /.  assert( PAGE
12a10 52 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44  R_SHARED==SHARED
12a20 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12a30 74 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  t( PAGER_RESERVE
12a40 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  D==RESERVED_LOCK
12a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
12a60 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45  GER_EXCLUSIVE==E
12a70 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b  XCLUSIVE_LOCK );
12a80 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69  ..  /* If the fi
12a90 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  le is currently 
12aa0 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68  unlocked then th
12ab0 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75  e size must be u
12ac0 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65  nknown */.  asse
12ad0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
12ae0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
12af0 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  || pPager->dbSiz
12b00 65 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a  e<0 || MEMDB );.
12b10 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
12b20 74 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  tate>=locktype )
12b30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12b40 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
12b50 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63     do {.      rc
12b60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
12b70 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  (pPager->fd, loc
12b80 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
12b90 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
12ba0 55 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e  USY && sqlite3In
12bb0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
12bc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
12bd0 64 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28  dler) );.    if(
12be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12bf0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
12c00 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
12c10 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
12c20 28 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c  ("LOCK %p %d\n",
12c30 20 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70   pPager, locktyp
12c40 65 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e)).    }.  }.  
12c50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12c60 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
12c70 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
12c80 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
12c90 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
12ca0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
12cb0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
12cc0 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a  r, Pgno nPage){.
12cd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
12ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
12cf0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
12d00 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71  || MEMDB );.  sq
12d10 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12d20 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
12d30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
12d40 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
12d50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
12d60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12d70 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
12d80 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
12d90 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
12da0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12db0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
12dc0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
12dd0 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
12de0 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63  .    pager_trunc
12df0 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
12e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
12e10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
12e20 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
12e30 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
12e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12e50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e60 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
12e70 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
12e80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
12e90 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
12ea0 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
12eb0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
12ec0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
12ed0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
12ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12ef0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12f00 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
12f10 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
12f20 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72   nPage);.  retur
12f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
12f40 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
12f50 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
12f60 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
12f70 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
12f80 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
12f90 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
12fa0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
12fb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12fc0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
12fd0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
12fe0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
12ff0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
13000 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
13010 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
13020 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
13030 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
13040 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
13050 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
13060 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
13070 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
13080 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
13090 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
130a0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
130b0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
130c0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
130d0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
130e0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
130f0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
13100 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
13110 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
13120 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
13130 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
13140 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
13150 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
13160 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
13170 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
13180 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
13190 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
131a0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
131b0 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
131c0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
131d0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
131e0 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  NT.  /* A malloc
131f0 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69  () cannot fail i
13200 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  n sqlite3ThreadD
13210 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20  ata() as one or 
13220 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20  more calls to . 
13230 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73   ** malloc() mus
13240 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
13250 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73  een made by this
13260 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69   thread before i
13270 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74  t gets.  ** to t
13280 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20  his point. This 
13290 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64  means the Thread
132a0 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62  Data must have b
132b0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  een allocated al
132c0 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68  ready.  ** so th
132d0 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41  at ThreadData.nA
132e0 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e  lloc can be set.
132f0 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61  .  */.  ThreadDa
13300 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74  ta *pTsd = sqlit
13310 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a  e3ThreadData();.
13320 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
13340 73 64 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c  sd && pTsd->nAll
13350 6f 63 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  oc );.#endif..  
13360 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
13370 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20  d_io_errors();. 
13380 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
13390 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
133a0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
133b0 30 3b 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74  0;.  pager_reset
133c0 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65  (pPager);.  page
133d0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
133e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e  ck(pPager);.  en
133f0 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
13400 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
13410 47 45 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45  GERTRACE2("CLOSE
13420 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
13430 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52  pPager));.  IOTR
13440 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e  ACE(("CLOSE %p\n
13450 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 61 73  ", pPager)).  as
13460 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
13470 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
13480 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
13490 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
134a0 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
134b0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
134c0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
134d0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
134e0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
134f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
13500 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
13510 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
13520 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
13530 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
13540 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
13550 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
13560 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
13570 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
13580 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
13590 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
135a0 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
135b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
135c0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
135d0 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
135e0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
135f0 2a 20 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66  * }.  */..#ifdef
13600 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
13610 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
13620 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65  .  /* Remove the
13630 20 70 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20   pager from the 
13640 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70  linked list of p
13650 61 67 65 72 73 20 73 74 61 72 74 69 6e 67 20 61  agers starting a
13660 74 20 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61  t .  ** ThreadDa
13670 74 61 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d  ta.pPager if mem
13680 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69  ory-management i
13690 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a  s enabled..  */.
136a0 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54    if( pPager==pT
136b0 73 64 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20  sd->pPager ){.  
136c0 20 20 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d    pTsd->pPager =
136d0 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a   pPager->pNext;.
136e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67    }else{.    Pag
136f0 65 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f  er *pTmp;.    fo
13700 72 28 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70  r(pTmp = pTsd->p
13710 50 61 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65  Pager; pTmp->pNe
13720 78 74 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70  xt!=pPager; pTmp
13730 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  =pTmp->pNext){}.
13740 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20      pTmp->pNext 
13750 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
13760 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
13770 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
13780 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74  >aHash);.  sqlit
13790 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54  eFree(pPager->pT
137a0 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69  mpSpace);.  sqli
137b0 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
137c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
137d0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  OK;.}..#if !defi
137e0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
137f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
13800 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ST)./*.** Return
13810 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
13820 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
13830 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
13840 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  o sqlite3PagerPa
13850 67 65 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20  genumber(DbPage 
13860 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
13870 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a  >pgno;.}.#endif.
13880 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f  ./*.** The page_
13890 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ref() function i
138a0 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65  ncrements the re
138b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
138c0 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20  r a page..** If 
138d0 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  the page is curr
138e0 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
138f0 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72  elist (the refer
13900 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65  ence count is ze
13910 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f  ro) then.** remo
13920 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66  ve it from the f
13930 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46  reelist..**.** F
13940 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74  or non-test syst
13950 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20  ems, page_ref() 
13960 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20  is a macro that 
13970 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28  calls _page_ref(
13980 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74  ).** online of t
13990 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
139a0 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72  nt is zero.  For
139b0 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70   test systems, p
139c0 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20  age_ref().** is 
139d0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
139e0 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  so that we can s
139f0 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61  et breakpoints a
13a00 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a  nd trace it..*/.
13a10 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67  static void _pag
13a20 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
13a30 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  ){.  if( pPg->nR
13a40 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ef==0 ){.    /* 
13a50 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72  The page is curr
13a60 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65  ently on the fre
13a70 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69  elist.  Remove i
13a80 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  t. */.    if( pP
13a90 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  g==pPg->pPager->
13aa0 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a  pFirstSynced ){.
13ab0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d        PgHdr *p =
13ac0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
13ad0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20  .      while( p 
13ae0 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
13af0 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72  { p = p->pNextFr
13b00 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d  ee; }.      pPg-
13b10 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
13b20 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d  ynced = p;.    }
13b30 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
13b40 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
13b50 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
13b60 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
13b70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
13b80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
13b90 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
13ba0 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  t = pPg->pNextFr
13bb0 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ee;.    }.    if
13bc0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
13bd0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
13be0 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
13bf0 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
13c00 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
13c10 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
13c20 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
13c30 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
13c40 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  }.    pPg->pPage
13c50 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
13c60 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
13c70 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a  REFINFO(pPg);.}.
13c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
13c90 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
13ca0 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
13cb0 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
13cc0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
13cd0 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
13ce0 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
13cf0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
13d00 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
13d10 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
13d20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
13d30 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
13d40 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
13d50 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
13d60 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
13d70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
13d80 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
13d90 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
13da0 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
13db0 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
13dc0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
13dd0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
13de0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  nt sqlite3PagerR
13df0 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ef(DbPage *pPg){
13e00 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
13e10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13e20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
13e30 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
13e40 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
13e50 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
13e60 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
13e70 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
13e80 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
13e90 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
13ea0 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
13eb0 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
13ec0 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
13ed0 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
13ee0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
13ef0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
13f00 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
13f10 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
13f20 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
13f30 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
13f40 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
13f50 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
13f60 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
13f70 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
13f80 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
13f90 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
13fa0 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
13fb0 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
13fc0 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
13fd0 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
13fe0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
13ff0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
14000 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
14010 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
14020 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14030 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
14040 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
14050 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
14060 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
14070 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
14080 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
14090 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
140a0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
140b0 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
140c0 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
140d0 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
140e0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
140f0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
14100 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
14110 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
14120 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
14130 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
14140 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
14150 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
14160 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
14170 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
14180 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
14190 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
141a0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
141b0 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
141c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
141d0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
141e0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
141f0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
14200 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
14210 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
14220 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
14230 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
14240 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
14250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14260 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
14270 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
14280 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
14290 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
142a0 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
142b0 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
142c0 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
142d0 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
142e0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
142f0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
14300 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
14310 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
14320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
14330 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
14340 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
14350 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
14360 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
14370 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
14380 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
14390 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
143a0 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
143b0 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
143c0 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
143d0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
143e0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
143f0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
14400 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
14410 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
14420 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
14430 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
14440 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
14450 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
14460 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
14470 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
14480 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
14490 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
144a0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
144b0 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
144c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
144d0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
144e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
144f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14500 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
14510 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
14520 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
14530 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
14540 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
14550 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
14560 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
14570 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
14580 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
14590 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
145a0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
145b0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
145c0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
145d0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
145e0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
145f0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
14600 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
14610 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
14620 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
14630 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
14640 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
14650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
14660 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
14670 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
14680 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
14690 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
146a0 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
146b0 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
146c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
146d0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
146e0 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20  r->jfd, 0);.    
146f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14700 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
14720 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
14730 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  k(pPager->jfd,. 
14740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14750 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
14760 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
14770 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
14780 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
14790 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
147a0 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41  c;.        IOTRA
147b0 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c  CE(("JHDR %p %ll
147c0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
147d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
147e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
147f0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
14800 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34  JournalMagic), 4
14810 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  )).        rc = 
14820 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
14830 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
14840 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
14850 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14860 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20  rc;..        rc 
14870 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
14880 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
14890 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
148a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
148b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
148c0 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45      }.      PAGE
148d0 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
148e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
148f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
14900 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
14910 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
14920 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 72 63  Pager)).      rc
14930 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
14940 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
14950 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
14960 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14970 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
14980 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
14990 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
149a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
149b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
149c0 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
149d0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
149e0 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
149f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
14a00 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
14a10 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
14a20 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
14a30 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
14a40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
14a50 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
14a60 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
14a70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
14a80 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
14a90 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
14aa0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
14ab0 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
14ac0 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
14ad0 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
14ae0 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
14af0 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
14b00 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
14b10 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
14b20 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
14b30 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
14b40 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
14b50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
14b60 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14b70 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
14b80 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
14b90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
14ba0 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
14bb0 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
14bc0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
14bd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14be0 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20  Merge two lists 
14bf0 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  of pages connect
14c00 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64  ed by pDirty and
14c10 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a   in pgno order..
14c20 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66  ** Do not both f
14c30 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44  ixing the pPrevD
14c40 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a  irty pointers..*
14c50 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
14c60 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50  merge_pagelist(P
14c70 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20  gHdr *pA, PgHdr 
14c80 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65  *pB){.  PgHdr re
14c90 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20  sult, *pTail;.  
14ca0 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b  pTail = &result;
14cb0 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
14cc0 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
14cd0 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20  ->pgno<pB->pgno 
14ce0 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  ){.      pTail->
14cf0 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20  pDirty = pA;.   
14d00 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20     pTail = pA;. 
14d10 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44       pA = pA->pD
14d20 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
14d30 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
14d40 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20  irty = pB;.     
14d50 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20   pTail = pB;.   
14d60 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72     pB = pB->pDir
14d70 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ty;.    }.  }.  
14d80 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54  if( pA ){.    pT
14d90 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
14da0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
14db0 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
14dc0 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65  Dirty = pB;.  }e
14dd0 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  lse{.    pTail->
14de0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  pDirty = 0;.  }.
14df0 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e    return result.
14e00 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
14e10 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f   Sort the list o
14e20 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  f pages in accen
14e30 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67  ding order by pg
14e40 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a  no.  Pages are.*
14e50 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  * connected by p
14e60 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20  Dirty pointers. 
14e70 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20   The pPrevDirty 
14e80 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20  pointers are.** 
14e90 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69  corrupted by thi
14ea0 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69  s sort..*/.#defi
14eb0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
14ec0 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e  _ALLOC 25.#defin
14ed0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
14ee0 20 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20        25.#ifdef 
14ef0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
14f00 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
14f10 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20  n_sort_bucket = 
14f20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f  0;.  #undef N_SO
14f30 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66  RT_BUCKET.  #def
14f40 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
14f50 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f  T \.   (sqlite3_
14f60 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
14f70 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65  ket?sqlite3_page
14f80 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a  r_n_sort_bucket:
14f90 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
14fa0 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  LOC).#endif.stat
14fb0 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70  ic PgHdr *sort_p
14fc0 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
14fd0 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b  In){.  PgHdr *a[
14fe0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
14ff0 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20  LOC], *p;.  int 
15000 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30  i;.  memset(a, 0
15010 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20  , sizeof(a));.  
15020 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20  while( pIn ){.  
15030 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70    p = pIn;.    p
15040 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  In = p->pDirty;.
15050 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
15060 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
15070 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  i<N_SORT_BUCKET-
15080 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
15090 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  f( a[i]==0 ){.  
150a0 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a        a[i] = p;.
150b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
150c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
150d0 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
150e0 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
150f0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
15100 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
15110 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f  .    if( i==N_SO
15120 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20  RT_BUCKET-1 ){. 
15130 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
15140 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74  : To get here, t
15150 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20  here need to be 
15160 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  2^(N_SORT_BUCKET
15170 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  ) .      ** elem
15180 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
15190 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  t list. This is 
151a0 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d  possible, but im
151b0 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20  practical..     
151c0 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73   ** Testing this
151d0 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69   line is the poi
151e0 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72  nt of global var
151f0 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73  iable.      ** s
15200 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
15210 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20  ort_bucket..    
15220 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20    */.      a[i] 
15230 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
15240 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d  (a[i], p);.    }
15250 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b  .  }.  p = a[0];
15260 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f  .  for(i=1; i<N_
15270 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b  SORT_BUCKET; i++
15280 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65  ){.    p = merge
15290 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69  _pagelist(p, a[i
152a0 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
152b0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
152c0 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
152d0 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
152e0 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
152f0 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
15300 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
15310 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
15320 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15330 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
15340 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
15350 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
15360 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
15370 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
15380 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
15390 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
153a0 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  ;..  if( pList==
153b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
153c0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
153d0 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
153e0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
153f0 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
15400 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
15410 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
15420 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
15430 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15440 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
15450 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
15460 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
15470 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20  wing.  ** calls 
15480 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  to sqlite3OsLock
15490 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20  () are no-ops.. 
154a0 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20   **.  ** Moving 
154b0 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45  the lock from RE
154c0 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53  SERVED to EXCLUS
154d0 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76  IVE actually inv
154e0 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a  olves going.  **
154f0 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65   through an inte
15500 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50  rmediate state P
15510 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44  ENDING.   A PEND
15520 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74  ING lock prevent
15530 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65  s new.  ** reade
15540 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e  rs from attachin
15550 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
15560 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69  e but is unsuffi
15570 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a  cient for us to.
15580 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65    ** write.  The
15590 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49   idea of a PENDI
155a0 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72  NG lock is to pr
155b0 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72  event new reader
155c0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69  s from.  ** comi
155d0 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77  ng in while we w
155e0 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67  ait for existing
155f0 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61   readers to clea
15600 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69  r..  **.  ** Whi
15610 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20  le the pager is 
15620 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20  in the RESERVED 
15630 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69  state, the origi
15640 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
15650 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e  e.  ** is unchan
15660 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72  ged and we can r
15670 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ollback without 
15680 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61  having to playba
15690 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72  ck the.  ** jour
156a0 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  nal into the ori
156b0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
156c0 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72  ile.  Once we tr
156d0 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a  ansition to.  **
156e0 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d   EXCLUSIVE, it m
156f0 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
15700 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  e file has been 
15710 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20  changed and any 
15720 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69  rollback.  ** wi
15730 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75  ll require a jou
15740 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20  rnal playback.. 
15750 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
15760 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
15770 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
15780 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
15790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
157a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
157b0 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74  ..  pList = sort
157c0 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29  _pagelist(pList)
157d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74  ;.  while( pList
157e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
157f0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a  pList->dirty );.
15800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15810 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
15820 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d  d, (pList->pgno-
15830 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
15840 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
15850 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15860 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  c;.    /* If the
15870 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
15880 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
15890 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
158a0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
158b0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
158c0 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
158d0 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
158e0 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  Truncate() was c
158f0 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
15900 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
15910 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
15920 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
15930 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
15940 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
15950 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
15960 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
15970 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
15980 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
15990 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  ze ){.      char
159a0 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32   *pData = CODEC2
159b0 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54  (pPager, PGHDR_T
159c0 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70  O_DATA(pList), p
159d0 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a  List->pgno, 6);.
159e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
159f0 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65  4("STORE %d page
15a00 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
15a10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15a20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
15a30 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
15a40 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
15a50 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20  sh(pList));.    
15a60 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55    IOTRACE(("PGOU
15a70 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  T %p %d\n", pPag
15a80 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  er, pList->pgno)
15a90 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
15aa0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
15ab0 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
15ac0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15ad0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49  );.      PAGER_I
15ae0 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
15af0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29  r_writedb_count)
15b00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
15b10 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74  CR(pPager->nWrit
15b20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  e);.      if( pL
15b30 69 73 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  ist->pgno==1 ){.
15b40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
15b50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
15b60 72 73 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20  rs, &pData[24], 
15b70 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
15b80 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
15b90 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
15ba0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c  ef NDEBUG.    el
15bb0 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54  se{.      PAGERT
15bc0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
15bd0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
15be0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15bf0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
15c00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15c10 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15c20 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
15c30 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
15c40 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
15c50 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
15c60 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
15c70 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
15c80 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
15c90 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
15ca0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
15cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15cc0 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
15cd0 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
15ce0 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
15cf0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
15d00 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
15d10 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
15d20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
15d30 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
15d40 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
15d50 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
15d60 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
15d70 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
15d80 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
15d90 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
15da0 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a  ager->pDirty;.}.
15db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
15dc0 55 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61  UE if there is a
15dd0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20   hot journal on 
15de0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
15df0 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61  .** A hot journa
15e00 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65  l is one that ne
15e10 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
15e20 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
15e30 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
15e40 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
15e50 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
15e60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
15e70 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
15e80 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
15e90 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
15ea0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
15eb0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
15ec0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
15ed0 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65   Just delete the
15ee0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
15ef0 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f  tic int hasHotJo
15f00 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
15f10 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ger){.  if( !pPa
15f20 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
15f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
15f40 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  ( !sqlite3OsFile
15f50 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
15f60 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
15f70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15f80 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65  if( sqlite3OsChe
15f90 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70  ckReservedLock(p
15fa0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
15fb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
15fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
15fd0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
15fe0 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  er)==0 ){.    sq
15ff0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
16000 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
16010 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
16030 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
16040 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
16050 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
16060 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
16070 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
16080 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
16090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
160a0 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
160b0 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
160c0 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
160d0 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
160e0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
160f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16100 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
16110 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
16120 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a   syncOk, PgHdr *
16130 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
16140 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
16150 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45  0;..  assert(!ME
16160 4d 44 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  MDB);..  /* Find
16170 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
16180 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
16190 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
161a0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
161b0 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
161c0 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
161d0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
161e0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
161f0 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f  irstSynced;..  /
16200 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
16210 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
16220 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
16230 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
16240 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
16250 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79  al file then fsy
16260 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
16270 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a  ile.  This is a.
16280 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
16290 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
162a0 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
162b0 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
162c0 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61  times.  ** it ca
162d0 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
162e0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30   */.  if( pPg==0
162f0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
16300 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20  st && syncOk && 
16310 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74  !MEMDB){.    int
16320 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
16330 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  l(pPager);.    i
16340 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
16350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16360 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
16370 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
16380 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75       /* If in fu
16390 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72  ll-sync mode, wr
163a0 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61  ite a new journa
163b0 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68  l header into th
163c0 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  e.      ** journ
163d0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  al file. This is
163e0 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65   done to avoid e
163f0 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ver modifying a 
16400 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  journal.      **
16410 20 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20   header that is 
16420 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
16430 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65  rollback of page
16440 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
16450 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
16460 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
16470 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
16480 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
16490 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65  .      ** trashe
164a0 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20  d when the nRec 
164b0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
164c0 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
164d0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
164e0 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
164f0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
16500 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20  lOff > 0 );.    
16510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16520 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
16530 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
16540 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
16550 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
16560 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
16570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16580 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
16590 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
165a0 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  st;.  }.  if( pP
165b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  g==0 ){.    retu
165c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
165d0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
165e0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
165f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
16600 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
16610 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
16620 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
16630 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
16640 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
16650 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
16660 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
16670 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
16680 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
16690 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
166a0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
166b0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
166c0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
166d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
166e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
166f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16700 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
16710 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
16720 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
16730 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
16740 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
16750 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
16760 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
16770 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
16780 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
16790 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
167a0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
167b0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
167c0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
167d0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
167e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
167f0 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
16800 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
16810 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
16820 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
16830 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
16840 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
16850 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
16860 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
16870 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
16880 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
16890 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
168a0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
168b0 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
168c0 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
168d0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
168e0 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
168f0 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
16900 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
16910 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
16920 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
16930 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
16940 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
16950 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
16960 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
16970 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
16980 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
16990 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
169a0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
169b0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
169c0 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
169d0 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
169e0 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
169f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16a00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
16a10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
16a20 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
16a30 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
16a40 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
16a50 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
16a60 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
16a70 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
16a80 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
16a90 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
16aa0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
16ab0 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
16ac0 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
16ad0 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
16ae0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16af0 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
16b00 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
16b10 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
16b20 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
16b30 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
16b40 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
16b50 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
16b60 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
16b70 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
16b80 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
16b90 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
16ba0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
16bb0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
16bc0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
16bd0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
16be0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
16bf0 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
16c00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
16c10 49 54 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73  IT_DISKIO).int s
16c20 71 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61  qlite3PagerRelea
16c30 73 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65  seMemory(int nRe
16c40 71 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65  q){.  const Thre
16c50 61 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d  adData *pTsdro =
16c60 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
16c70 74 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20  taReadOnly();.  
16c80 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20  int nReleased = 
16c90 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
16ca0 2a 20 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f  * If the the glo
16cb0 62 61 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c  bal mutex is hel
16cc0 64 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  d, this subrouti
16cd0 6e 65 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a  ne becomes a.  *
16ce0 2a 20 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74  * o-op; zero byt
16cf0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65  es of memory are
16d00 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 69 73   freed.  This is
16d10 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f   because.  ** so
16d20 6d 65 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69  me of the code i
16d30 6e 76 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66  nvoked by this f
16d40 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f  unction may also
16d50 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74  .  ** try to obt
16d60 61 69 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72  ain the mutex, r
16d70 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65  esulting in a de
16d80 61 64 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  adlock..  */.  i
16d90 66 28 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75  f( sqlite3OsInMu
16da0 74 65 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65  tex(0) ){.    re
16db0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
16dc0 2a 20 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70  * Outermost loop
16dd0 20 72 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73   runs for at mos
16de0 74 20 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73  t two iterations
16df0 2e 20 46 69 72 73 74 20 69 74 65 72 61 74 69 6f  . First iteratio
16e00 6e 20 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f  n we.  ** try to
16e10 20 66 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61   find memory tha
16e20 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
16e30 64 20 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e  d without callin
16e40 67 20 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e  g fsync(). Secon
16e50 64 0a 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e  d.  ** iteration
16e60 20 28 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e   (which only run
16e70 73 20 69 66 20 74 68 65 20 66 69 72 73 74 20 66  s if the first f
16e80 61 69 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52  ailed to free nR
16e90 65 71 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a  eq bytes of.  **
16ea0 20 6d 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d   memory) is perm
16eb0 69 74 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73  itted to call fs
16ec0 79 6e 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f  ync(). This is o
16ed0 66 20 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f  f course much mo
16ee0 72 65 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69  re .  ** expensi
16ef0 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ve..  */.  for(i
16f00 3d 30 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a  =0; i<=1; i++){.
16f10 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
16f20 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c  ough all the SQL
16f30 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65  ite pagers opene
16f40 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
16f50 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20   thread. */.    
16f60 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16f70 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a  pTsdro->pPager;.
16f80 20 20 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65      for( ; pPage
16f90 72 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20  r && (nReq<0 || 
16fa0 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b  nReleased<nReq);
16fb0 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e   pPager=pPager->
16fc0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67  pNext){.      Pg
16fd0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
16fe0 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69  int rc;..      i
16ff0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17000 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17010 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17020 46 6f 72 20 65 61 63 68 20 70 61 67 65 72 2c 20  For each pager, 
17030 74 72 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d  try to free as m
17040 61 6e 79 20 70 61 67 65 73 20 61 73 20 70 6f 73  any pages as pos
17050 73 69 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a  sible (without .
17060 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
17070 20 66 73 79 6e 63 28 29 20 69 66 20 74 68 69 73   fsync() if this
17080 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69 74   is the first it
17090 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f  eration of the o
170a0 75 74 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20  utermost .      
170b0 2a 2a 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20  ** loop)..      
170c0 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
170d0 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
170e0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
170f0 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29  Pager, i, &pPg))
17100 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
17110 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
17120 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
17130 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
17140 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
17150 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
17160 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
17170 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
17180 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
17190 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
171a0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
171b0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
171c0 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
171d0 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
171e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
171f0 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
17200 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
17210 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
17220 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
17230 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
17240 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
17250 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
17260 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
17270 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
17280 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
17290 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
172a0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
172b0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
172c0 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d         if( pPg==
172d0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
172e0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
172f0 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70  r->pAll = pPg->p
17300 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20  NextAll;.       
17310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17320 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67    for( pTmp=pPag
17330 65 72 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e  er->pAll; pTmp->
17340 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70  pNextAll!=pPg; p
17350 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41  Tmp=pTmp->pNextA
17360 6c 6c 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20  ll ){}.         
17370 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20   pTmp->pNextAll 
17380 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
17390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
173a0 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
173b0 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28  sqliteAllocSize(
173c0 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  pPg);.        IO
173d0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
173e0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
173f0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
17400 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
17410 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
17420 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
17430 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
17440 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  (pPg);.      }..
17450 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17470 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f     /* An error o
17480 63 63 75 72 65 64 20 77 68 69 6c 73 74 20 77 72  ccured whilst wr
17490 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
174a0 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20  abase file or . 
174b0 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
174c0 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63  l in pager_recyc
174d0 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20  le(). The error 
174e0 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20  is not returned 
174f0 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  to the .        
17500 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69  ** caller of thi
17510 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74  s function. Inst
17520 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61 67  ead, set the Pag
17530 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61  er.errCode varia
17540 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble..        ** 
17550 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62  The error will b
17560 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
17570 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73  e user (or users
17580 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20  , in the case . 
17590 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73         ** of a s
175a0 68 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68  hared pager cach
175b0 65 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  e) of the pager 
175c0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72  for which the er
175d0 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20  ror occured..   
175e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
175f0 61 73 73 65 72 74 28 20 28 72 63 26 30 78 66 66  assert( (rc&0xff
17600 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  )==SQLITE_IOERR 
17610 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  || rc==SQLITE_FU
17620 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LL );.        as
17630 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17640 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
17650 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
17660 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17670 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  r, rc);.      }.
17680 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
17690 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
176a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
176b0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
176c0 4d 41 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53  MANAGEMENT && !S
176d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
176e0 4f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  O */../*.** Read
176f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
17700 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
17710 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17720 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
17730 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
17740 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
17750 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
17760 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
17770 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
17780 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17790 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
177a0 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
177b0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
177c0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ze);.  if( rc==S
177d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
177e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
177f0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
17800 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17810 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
17830 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17840 20 20 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52    }.  PAGER_INCR
17850 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  (sqlite3_pager_r
17860 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  eaddb_count);.  
17870 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
17880 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54  r->nRead);.  IOT
17890 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25  RACE(("PGIN %p %
178a0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67  d\n", pPager, pg
178b0 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  no));.  if( pgno
178c0 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
178d0 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
178e0 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
178f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
17900 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
17940 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
17950 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
17960 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
17970 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
17980 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45  pgno, 3);.  PAGE
17990 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25  RTRACE4("FETCH %
179a0 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25  d page %d hash(%
179b0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
179c0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
179d0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
179e0 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
179f0 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75  sh(pPg));.  retu
17a00 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
17a10 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17a20 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
17a30 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
17a40 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
17a50 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
17a60 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
17a70 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
17a80 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17a90 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
17aa0 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
17ab0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
17ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
17ad0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
17ae0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
17af0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
17b00 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
17b10 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
17b20 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
17b30 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
17b40 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
17b50 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
17b60 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
17b70 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
17b80 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
17b90 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
17ba0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17bb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17bc0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
17bd0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
17be0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
17bf0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
17c00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
17c10 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
17c20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
17c30 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
17c40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
17c50 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
17c60 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
17c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17c90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
17ca0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
17cb0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
17cc0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
17cd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
17ce0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17cf0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
17d00 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
17d10 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
17d20 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
17d30 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
17d40 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
17d50 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
17d60 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
17d70 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
17d80 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
17d90 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
17da0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
17db0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
17dc0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
17dd0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
17de0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17df0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
17e00 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
17e10 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
17e20 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
17e30 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
17e40 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
17e50 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
17e60 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
17e70 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
17e80 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
17e90 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
17ea0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
17eb0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
17ec0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
17ed0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
17ee0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17ef0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
17f00 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
17f10 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
17f20 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
17f30 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
17f40 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
17f50 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
17f60 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
17f70 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
17f80 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
17f90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
17fa0 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
17fb0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
17fc0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
17fd0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
17fe0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
17ff0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
18000 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
18010 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
18020 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
18030 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
18040 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
18050 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
18060 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18070 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18080 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
18090 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
180a0 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
180b0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
180c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
180d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
180e0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
180f0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
18100 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
18110 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
18120 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
18130 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
18140 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
18150 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
18160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
18170 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
18180 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
18190 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
181a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
181b0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
181c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
181d0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
181e0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
181f0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
18200 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
18210 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
18220 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
18230 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
18240 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
18250 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
18260 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
18270 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
18280 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
18290 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
182a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
182b0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
182c0 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
182d0 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
182e0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
182f0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
18300 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
18310 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
18320 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
18330 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
18340 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
18350 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
18360 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
18370 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
18380 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
18390 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
183a0 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
183b0 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
183c0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
183d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
183e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
183f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
18400 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
18410 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
18420 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
18430 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
18440 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
18450 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
18460 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
18470 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
18480 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61 67  enReadWrite(pPag
18490 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
184a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29  Pager->jfd, &ro)
184b0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
184c0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
184d0 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
184e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
184f0 28 20 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  ( ro ){.        
18500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18510 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
18520 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
18530 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
18540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
18560 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18570 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
18580 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
18590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
185a0 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
185b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
185c0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
185d0 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
185e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
185f0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
18600 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18610 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
18620 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18630 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
18640 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
18650 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
18660 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
18670 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
18680 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
18690 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
186a0 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
186b0 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
186c0 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
186d0 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
186e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
186f0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
18700 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
18710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
18730 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
18740 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
18750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
18760 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
18770 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
18780 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
18790 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
187a0 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
187b0 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
187c0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
187d0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
187e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
187f0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
18800 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
18810 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
18820 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
18830 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
18840 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
18850 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
18860 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
18870 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
18880 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
18890 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
188a0 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
188b0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
188c0 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
188d0 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
188e0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
188f0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
18900 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
18910 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
18920 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
18930 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
18940 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
18950 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
18960 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
18970 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
18980 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
18990 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
189a0 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
189b0 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
189c0 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
189d0 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
189e0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
189f0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
18a00 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
18a10 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
18a20 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
18a30 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
18a40 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
18a50 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
18a60 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
18a70 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
18a80 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
18a90 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
18aa0 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
18ab0 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
18ac0 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
18ad0 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
18ae0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
18af0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
18b00 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
18b10 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
18b20 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
18b30 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
18b40 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
18b50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
18b60 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
18b70 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
18b80 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
18b90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18ba0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
18bb0 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
18bc0 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
18bd0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
18be0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
18bf0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
18c00 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
18c10 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
18c20 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
18c30 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
18c40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18c50 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
18c60 66 64 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  fd, 24);.       
18c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18c90 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18ca0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
18cb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18cc0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
18cd0 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
18ce0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
18cf0 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rs));.          
18d00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18d10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
18d20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18d50 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
18d60 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
18d70 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
18d80 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
18d90 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
18da0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
18db0 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
18dc0 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
18dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
18de0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
18df0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18e00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
18e10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
18e20 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
18e30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
18e40 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
18e50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
18e60 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
18e70 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
18e80 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
18e90 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
18ea0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
18eb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
18ec0 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65  ate a PgHdr obje
18ed0 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65  ct.   Either cre
18ee0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72  ate a new one or
18ef0 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69   reuse.** an exi
18f00 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69  sting one that i
18f10 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
18f20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  in use..**.** A 
18f30 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74  new PgHdr struct
18f40 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
18f50 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
18f60 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72  lowing are.** tr
18f70 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
18f80 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65  )  We have not e
18f90 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69  xceeded our maxi
18fa0 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  mum allocated ca
18fb0 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
18fc0 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74       as set by t
18fd0 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  he "PRAGMA cache
18fe0 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  _size" command..
18ff0 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
19000 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73  here are no unus
19010 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ed PgHdr objects
19020 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68   available at th
19030 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  is time..**.**  
19040 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20     (3)  This is 
19050 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
19060 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
19070 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20   (4)  There are 
19080 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  no PgHdr objects
19090 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
190a0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  uire a journal.*
190b0 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  *          file 
190c0 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20  sync and a sync 
190d0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
190e0 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
190f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f  .**          pro
19100 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  hibited..**.** O
19110 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20  therwise, reuse 
19120 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  an existing PgHd
19130 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
19140 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20  ds, reuse an.** 
19150 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69  existing PgHdr i
19160 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
19170 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
19180 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
19190 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
191a0 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20  or exceeded the 
191b0 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69  maximum cache si
191c0 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
191d0 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d  llowed by "PRAGM
191e0 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a  A cache_size"..*
191f0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
19200 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61  ere is a PgHdr a
19210 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67  vailable with Pg
19220 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a  Hdr->nRef==0.**.
19230 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61  **     (3)  We a
19240 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d  re not in an in-
19250 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
19260 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45  **.**     (4)  E
19270 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61  ither there is a
19280 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64  n available PgHd
19290 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  r that does not 
192a0 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  need.**         
192b0 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f   to be synced to
192c0 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69   disk or else di
192d0 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75  sk syncing is cu
192e0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
192f0 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a      allowed..*/.
19300 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19310 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67  AllocatePage(Pag
19320 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
19330 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74  r **ppPg){.  int
19340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19350 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
19360 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
19370 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f  w PgHdr if any o
19380 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69  f the four condi
19390 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20  tions defined . 
193a0 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74   ** above is met
193b0 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
193c0 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
193d0 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
193e0 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
193f0 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
19400 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72  || (pPager->pFir
19410 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70  stSynced==0 && p
19420 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
19430 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
19440 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50  Pager->nPage>=pP
19450 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20  ager->nHash ){. 
19460 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a       pager_resiz
19470 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61  e_hash_table(pPa
19480 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50  ger,.         pP
19490 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20  ager->nHash<256 
194a0 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e  ? 256 : pPager->
194b0 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20  nHash*2);.      
194c0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  if( pPager->nHas
194d0 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
194e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
194f0 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
19500 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
19510 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
19520 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  }.    pPg = sqli
19530 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
19540 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
19550 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
19560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19570 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
19580 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
19590 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
195c0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
195d0 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
195e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
195f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19600 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
19610 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
19620 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
19630 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
19640 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
19650 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
19660 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
19670 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
19680 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
19690 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ));.    }.    pP
196a0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
196b0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
196c0 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
196d0 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72  pAll;.    pPager
196e0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
196f0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
19700 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
19710 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
19720 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
19730 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
19740 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
19750 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
19760 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  ger, 1, &pPg);. 
19770 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19780 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
19790 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
197a0 52 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d  R_BLOCKED;.    }
197b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
197c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
197d0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
197e0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
197f0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19800 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44  r->state>=SHARED
19810 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
19820 65 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ert(pPg);.  }.  
19830 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61  *ppPg = pPg;..pa
19840 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
19850 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
19860 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
19870 65 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f  e we have the co
19880 6e 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65  ntent for a page
19890 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77  .  If the page w
198a0 61 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  as.** previously
198b0 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
198c0 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65  oContent==1, the
198d0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61  n the content wa
198e0 73 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61  s.** just initia
198f0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69  lized to zeros i
19900 6e 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20  nstead of being 
19910 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
19920 2a 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65  ** But now we ne
19930 65 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61  ed the real data
19940 20 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53   off of disk.  S
19950 6f 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a  o make sure we.*
19960 2a 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64  * have it.  Read
19970 20 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20   it in if we do 
19980 6e 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65  not have it alre
19990 61 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ady..*/.static i
199a0 6e 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e  nt pager_get_con
199b0 74 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  tent(PgHdr *pPg)
199c0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65  {.  if( pPg->nee
199d0 64 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74  dRead ){.    int
199e0 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65   rc = readDbPage
199f0 28 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50  (pPg->pPager, pP
19a00 67 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  g, pPg->pgno);. 
19a10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19a20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
19a30 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
19a40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19a50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19a60 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19a70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
19a80 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
19a90 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
19aa0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
19ab0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
19ac0 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
19ad0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
19ae0 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
19af0 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
19b00 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
19b10 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
19b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19b30 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61  tine works for a
19b40 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
19b50 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
19b60 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
19b70 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
19b80 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
19b90 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
19ba0 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
19bb0 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
19bc0 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
19bd0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
19be0 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
19bf0 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
19c00 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
19c10 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
19c20 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
19c30 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
19c40 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
19c50 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
19c60 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
19c70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
19c80 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
19c90 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
19ca0 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
19cb0 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
19cc0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
19cd0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
19ce0 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
19cf0 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
19d00 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
19d10 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e  e3PagerLookup().
19d20 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74    Both this rout
19d30 69 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29  ine and Lookup()
19d40 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
19d50 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
19d60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
19d70 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
19d80 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
19d90 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
19da0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
19db0 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
19dc0 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
19dd0 61 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  as Lookup().** j
19de0 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
19df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
19e00 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
19e10 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
19e20 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
19e30 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
19e40 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
19e50 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
19e60 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
19e70 2a 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29  * Since Lookup()
19e80 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64   never goes to d
19e90 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61  isk, it never ha
19ea0 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c  s to deal with l
19eb0 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e  ocks.** or journ
19ec0 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  al files..**.** 
19ed0 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20  If noContent is 
19ee0 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20  false, the page 
19ef0 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74  contents are act
19f00 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20  ually read from 
19f10 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f  disk..** If noCo
19f20 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69  ntent is true, i
19f30 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
19f40 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
19f50 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  t the contents.*
19f60 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  * of the page at
19f70 20 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64   this time, so d
19f80 6f 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20  o not do a disk 
19f90 72 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c  read.  Just fill
19fa0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   in the.** page 
19fb0 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
19fc0 6f 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68  os.  But mark th
19fd0 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68  e fact that we h
19fe0 61 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65  ave not read the
19ff0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73  .** content by s
1a000 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72  etting the PgHdr
1a010 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20  .needRead flag. 
1a020 20 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a   Later on, if .*
1a030 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  * sqlite3PagerWr
1a040 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1a050 6f 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20  on this page or 
1a060 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
1a070 69 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61  is.** called aga
1a080 69 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  in with noConten
1a090 74 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==0, that means
1a0a0 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
1a0b0 74 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61  t is needed.** a
1a0c0 6e 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64  nd the disk read
1a0d0 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
1a0e0 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
1a0f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1a100 41 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72  Acquire(.  Pager
1a110 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f   *pPager,      /
1a120 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e  * The pager open
1a130 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a140 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
1a150 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f  pgno,          /
1a160 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
1a170 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61   fetch */.  DbPa
1a180 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1a190 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74  /* Write a point
1a1a0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  er to the page h
1a1b0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43  ere */.  int noC
1a1c0 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20  ontent       /* 
1a1d0 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65  Do not bother re
1a1e0 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72  ading content fr
1a1f0 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20  om disk if true 
1a200 2a 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  */.){.  PgHdr *p
1a210 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
1a220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a230 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1a240 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
1a250 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
1a260 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  1 );..  /* The m
1a270 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
1a280 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
1a290 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a2a0 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
1a2b0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
1a2c0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
1a2d0 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
1a2e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
1a2f0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
1a300 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
1a310 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
1a320 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1a330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a340 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a350 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
1a360 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
1a370 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
1a380 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
1a390 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
1a3a0 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
1a3b0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
1a3c0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
1a3d0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
1a3e0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
1a3f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1a400 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
1a410 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a420 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
1a430 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
1a440 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
1a450 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
1a460 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
1a470 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
1a480 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
1a490 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
1a4a0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
1a4b0 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
1a4c0 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
1a4d0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
1a4e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1a4f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1a500 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a510 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1a520 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20  OCK );..  pPg = 
1a530 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1a540 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1a550 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
1a560 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1a570 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1a580 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
1a590 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
1a5a0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
1a5b0 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1a5c0 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72  r->nMiss);.    r
1a5d0 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  c = pagerAllocat
1a5e0 65 50 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  ePage(pPager, &p
1a5f0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1a600 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a610 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a620 20 20 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70     }..    pPg->p
1a630 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
1a640 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c  assert( !MEMDB |
1a650 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73  | pgno>pPager->s
1a660 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69  tmtSize );.    i
1a670 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  f( pPager->aInJo
1a680 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67  urnal && (int)pg
1a690 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
1a6a0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
1a6b0 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f  sqlite3CheckMemo
1a6c0 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ry(pPager->aInJo
1a6d0 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a  urnal, pgno/8);.
1a6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1a6f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1a700 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  n );.      pPg->
1a710 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61  inJournal = (pPa
1a720 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1a730 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
1a740 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20  gno&7)))!=0;.   
1a750 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1a760 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1a770 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1a780 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1a790 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1a7a0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d   0;.    }..    m
1a7b0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
1a7c0 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
1a7d0 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50  ;.    REFINFO(pP
1a7e0 67 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d  g);..    pPager-
1a7f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28  >nRef++;.    if(
1a800 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
1a810 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
1a820 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
1a830 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
1a840 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
1a850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  );.    }.    nMa
1a860 78 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  x = sqlite3Pager
1a870 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1a880 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a890 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1a8a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1a8b0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1a8c0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
1a8d0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65  rrCode;.      re
1a8e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1a8f0 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1a900 74 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61  the page with da
1a910 74 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65  ta, either by re
1a920 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1a930 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
1a940 69 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69  ile, or by setti
1a950 6e 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  ng the entire pa
1a960 67 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20  ge to zero..    
1a970 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c  */.    if( nMax<
1a980 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d  (int)pgno || MEM
1a990 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74  DB || (noContent
1a9a0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77   && !pPager->alw
1a9b0 61 79 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a  aysRollback) ){.
1a9c0 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70        if( pgno>p
1a9d0 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
1a9e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1a9f0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1aa00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1aa10 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1aa20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
1aa30 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  t(PGHDR_TO_DATA(
1aa40 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  pPg), 0, pPager-
1aa50 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1aa60 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1aa70 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21  = noContent && !
1aa80 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1aa90 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f  llback;.      IO
1aaa0 54 52 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20  TRACE(("ZERO %p 
1aab0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1aac0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  gno));.    }else
1aad0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 61  {.      rc = rea
1aae0 64 44 62 50 61 67 65 28 70 50 61 67 65 72 2c 20  dDbPage(pPager, 
1aaf0 70 50 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg, pgno);.    
1ab00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ab10 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1ab20 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1ab30 41 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  AD ){.        pP
1ab40 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20  g->pgno = 0;.   
1ab50 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1ab60 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
1ab70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ab80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1ab90 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1aba0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c  .    }..    /* L
1abb0 69 6e 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74  ink the page int
1abc0 6f 20 74 68 65 20 70 61 67 65 20 68 61 73 68 20  o the page hash 
1abd0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d  table */.    h =
1abe0 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
1abf0 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61  >nHash-1);.    a
1ac00 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
1ac10 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
1ac20 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1ac30 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61  Hash[h];.    pPa
1ac40 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
1ac50 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
1ac60 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20  ->pNextHash ){. 
1ac70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1ac80 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
1ac90 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1aca0 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
1acb0 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  h->pPrevHash = p
1acc0 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  Pg;.    }..#ifde
1acd0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1ace0 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
1acf0 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1ad00 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1ad10 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1ad20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1ad30 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
1ad40 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1ad50 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61 67  .    assert(pPag
1ad60 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67  er->nRef>0 || pg
1ad70 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45  no==1);.    PAGE
1ad80 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1ad90 48 69 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e  Hit);.    if( !n
1ada0 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  oContent ){.    
1adb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
1adc0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
1add0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
1ade0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1adf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ae00 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
1ae10 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
1ae20 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1ae30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1ae40 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
1ae50 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
1ae60 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
1ae70 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
1ae80 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
1ae90 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
1aea0 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
1aeb0 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
1aec0 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
1aed0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
1aee0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
1aef0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
1af00 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
1af10 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
1af20 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
1af30 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
1af40 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
1af50 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
1af60 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
1af70 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
1af80 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
1af90 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
1afa0 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
1afb0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
1afc0 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
1afd0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
1afe0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
1aff0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
1b000 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
1b010 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
1b020 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
1b030 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
1b040 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1b050 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
1b060 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
1b070 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
1b080 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1b090 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1b0a0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
1b0b0 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
1b0c0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
1b0d0 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20  usiveMode );.   
1b0e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1b0f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1b100 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
1b110 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
1b120 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
1b130 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20  rn 0;.  }.  pPg 
1b140 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1b150 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1b160 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74  if( pPg==0 ) ret
1b170 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65  urn 0;.  page_re
1b180 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
1b190 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
1b1a0 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
1b1b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
1b1c0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1b1d0 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
1b1e0 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
1b1f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
1b200 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
1b210 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
1b220 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
1b230 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
1b240 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
1b250 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
1b260 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
1b270 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
1b280 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
1b290 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1b2a0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20  DbPage *pPg){.. 
1b2b0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1b2c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1b2d0 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
1b2e0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1b2f0 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
1b300 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52  pPg->nRef--;.  R
1b310 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
1b320 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1b330 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
1b340 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
1b350 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72  nces to a page r
1b360 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65  each 0, call the
1b370 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72  .  ** destructor
1b380 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67   and add the pag
1b390 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1b3a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
1b3b0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
1b3c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1b3d0 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
1b3e0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
1b3f0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
1b400 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65  0;.    pPg->pPre
1b410 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e  vFree = pPager->
1b420 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65  pLast;.    pPage
1b430 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  r->pLast = pPg;.
1b440 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
1b450 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
1b460 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
1b470 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b  pNextFree = pPg;
1b480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b490 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
1b4a0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1b4b0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
1b4c0 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ync==0 && pPager
1b4d0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
1b4e0 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  0 ){.      pPage
1b4f0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
1b500 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
1b510 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
1b520 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
1b530 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
1b540 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
1b550 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1b560 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
1b570 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
1b580 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
1b590 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
1b5a0 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
1b5b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b5c0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
1b5d0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
1b5e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b5f0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
1b600 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
1b610 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
1b620 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1b630 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1b640 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
1b650 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
1b660 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1b670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b690 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1b6a0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
1b6b0 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
1b6c0 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
1b6d0 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
1b6e0 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
1b6f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1b700 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
1b710 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b720 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
1b730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
1b740 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
1b750 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
1b760 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
1b770 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
1b780 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1b790 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
1b7a0 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
1b7b0 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
1b7c0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1b7d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
1b7e0 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
1b7f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1b800 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1b810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b820 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1b830 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b840 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1b850 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  al );.  assert( 
1b860 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1b870 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  al==0 );.  sqlit
1b880 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1b890 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67  (pPager);.  pPag
1b8a0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
1b8b0 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1b8c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1b8d0 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1b8e0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1b8f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1b900 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1b910 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1b920 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1b930 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1b940 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
1b950 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1b960 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  , &pPager->jfd,.
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
1b9a0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  e);.  assert( rc
1b9b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
1b9c0 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20  Pager->jfd );.  
1b9d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1b9e0 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
1b9f0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
1ba00 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
1ba10 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
1ba20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ba30 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
1ba40 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
1ba50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
1ba60 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
1ba70 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rnal);.    }.   
1ba80 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
1ba90 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
1baa0 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
1bab0 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
1bac0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
1bad0 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
1bae0 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
1baf0 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
1bb00 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
1bb10 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
1bb20 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
1bb30 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1bb40 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
1bb50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bb60 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
1bb70 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1bb80 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
1bb90 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1bba0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1bbb0 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
1bbc0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
1bbd0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1bbe0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
1bbf0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
1bc00 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
1bc10 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
1bc20 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
1bc30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1bc40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1bc50 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
1bc60 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
1bc70 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1bc80 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
1bc90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bca0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1bcb0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1bcc0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
1bcd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bce0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
1bcf0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
1bd00 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
1bd10 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
1bd20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bd30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1bd40 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
1bd50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1bd60 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
1bd70 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
1bd80 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
1bd90 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bda0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1bdb0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72  Journal = 0;.  r
1bdc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bdd0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
1bde0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
1bdf0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
1be00 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
1be10 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
1be20 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
1be30 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
1be40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f    sqlite3PagerCo
1be50 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 69  mmitPhaseTwo() i
1be60 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
1be70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1be80 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c  llback() is call
1be90 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1bea0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20  te3PagerClose() 
1beb0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
1bec0 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  *  sqlite3PagerU
1bed0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
1bee0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
1bef0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
1bf00 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
1bf10 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
1bf20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
1bf30 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
1bf40 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
1bf50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1bf60 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
1bf70 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
1bf80 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
1bf90 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
1bfa0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
1bfb0 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
1bfc0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
1bfd0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
1bfe0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
1bff0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1c000 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
1c010 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1c020 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
1c030 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
1c040 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
1c050 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
1c060 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
1c070 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1c080 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
1c090 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
1c0a0 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
1c0b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
1c0c0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
1c0d0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
1c0e0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
1c0f0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
1c100 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
1c110 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
1c120 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
1c130 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
1c140 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
1c150 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1c160 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
1c170 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
1c180 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
1c190 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
1c1a0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
1c1b0 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
1c1c0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
1c1d0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
1c1e0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1c1f0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
1c200 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
1c210 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
1c220 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
1c230 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
1c240 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
1c250 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
1c260 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
1c270 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
1c280 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1c290 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  (DbPage *pPg, in
1c2a0 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67  t exFlag){.  Pag
1c2b0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1c2c0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1c2d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c2e0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1c2f0 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Ref>0 );.  asser
1c300 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1c310 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1c320 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1c330 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41  state==PAGER_SHA
1c340 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72  RED ){.    asser
1c350 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
1c360 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
1c370 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1c380 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1c390 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
1c3a0 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  VE;.      pPager
1c3b0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70  ->origDbSize = p
1c3c0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1c3d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c3e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f  rc = sqlite3OsLo
1c3f0 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  ck(pPager->fd, R
1c400 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
1c410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c430 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1c440 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
1c450 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
1c460 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
1c470 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
1c480 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
1c490 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
1c4a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1c4b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
1c4c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c4d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c4e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1c4f0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1c500 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
1c510 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
1c520 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
1c530 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1c540 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1c550 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
1c560 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1c570 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
1c580 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1c590 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1c5a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1c5b0 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1c5c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1c5d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c5e0 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
1c5f0 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1c600 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
1c610 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
1c620 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
1c630 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
1c640 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
1c650 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
1c660 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
1c670 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
1c680 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
1c690 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
1c6a0 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
1c6b0 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
1c6c0 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
1c6d0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
1c6e0 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
1c6f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c700 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
1c710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c720 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
1c730 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c740 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1c750 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1c760 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1c770 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1c780 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1c790 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1c7a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
1c7b0 20 2b 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20   + 1 );.    if( 
1c7c0 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
1c7d0 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
1c7e0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1c7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c800 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
1c810 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1c820 53 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d  Size;.      rc =
1c830 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
1c840 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
1c850 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
1c860 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c870 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  en || pPager->jo
1c880 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63  urnalOff>0 || rc
1c890 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1c8a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c8b0 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65  *.** Make a page
1c8c0 20 64 69 72 74 79 2e 20 20 53 65 74 20 69 74 73   dirty.  Set its
1c8d0 20 64 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20   dirty flag and 
1c8e0 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 64 69  add it to the di
1c8f0 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74  rty.** page list
1c900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c910 20 6d 61 6b 65 44 69 72 74 79 28 50 67 48 64 72   makeDirty(PgHdr
1c920 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
1c930 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20  g->dirty==0 ){. 
1c940 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1c950 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1c960 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1c970 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1c980 72 74 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44  rty = pPager->pD
1c990 69 72 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50  irty;.    if( pP
1c9a0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a  ager->pDirty ){.
1c9b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44        pPager->pD
1c9c0 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
1c9d0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
1c9e0 20 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74    pPg->pPrevDirt
1c9f0 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
1ca00 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b  r->pDirty = pPg;
1ca10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1ca20 6b 65 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e  ke a page clean.
1ca30 20 20 43 6c 65 61 72 20 69 74 73 20 64 69 72 74    Clear its dirt
1ca40 79 20 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65  y bit and remove
1ca50 20 69 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20   it from the.** 
1ca60 64 69 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e  dirty page list.
1ca70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ca80 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20  makeClean(PgHdr 
1ca90 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1caa0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70  ->dirty ){.    p
1cab0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1cac0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72     if( pPg->pDir
1cad0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1cae0 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
1caf0 72 74 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  rty = pPg->pPrev
1cb00 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
1cb10 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44   if( pPg->pPrevD
1cb20 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50  irty ){.      pP
1cb30 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70  g->pPrevDirty->p
1cb40 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1cb50 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
1cb60 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
1cb70 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d  r->pDirty = pPg-
1cb80 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
1cb90 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   }.}.../*.** Mar
1cba0 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61 73  k a data page as
1cbb0 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65   writeable.  The
1cbc0 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
1cbd0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
1cbe0 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e  l .** if it is n
1cbf0 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ot there already
1cc00 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1cc10 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
1cc20 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20  efore making.** 
1cc30 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67  changes to a pag
1cc40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
1cc50 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1cc60 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1cc70 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74 65  the pager create
1cc80 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e  s a new.** journ
1cc90 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  al and acquires 
1cca0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1ccb0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1ccc0 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56 45    If the RESERVE
1ccd0 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20  D.** lock could 
1cce0 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64 2c  not be acquired,
1ccf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1cd00 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
1cd10 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69  Y.  The.** calli
1cd20 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  ng routine must 
1cd30 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72  check for that r
1cd40 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20  eturn value and 
1cd50 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74  be careful not t
1cd60 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20  o.** change any 
1cd70 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20  page data until 
1cd80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1cd90 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
1cda0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
1cdb0 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20  rnal file could 
1cdc0 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62  not be written b
1cdd0 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b 20  ecause the disk 
1cde0 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e  is full,.** then
1cdf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1ce00 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c  turns SQLITE_FUL
1ce10 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d  L and does an im
1ce20 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b  mediate rollback
1ce30 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75  ..** All subsequ
1ce40 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d 70  ent write attemp
1ce50 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53  ts also return S
1ce60 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c  QLITE_FULL until
1ce70 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63   there.** is a c
1ce80 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61  all to sqlite3Pa
1ce90 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73  gerCommit() or s
1cea0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1ceb0 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65  ack() to.** rese
1cec0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1ced0 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48   pager_write(PgH
1cee0 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64  dr *pPg){.  void
1cef0 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f   *pData = PGHDR_
1cf00 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
1cf10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1cf20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1cf30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1cf40 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
1cf50 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
1cf60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1cf70 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74  Code ){ .    ret
1cf80 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1cf90 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
1cfa0 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
1cfb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1cfc0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a  LITE_PERM;.  }..
1cfd0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1cfe0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a  r->setMaster );.
1cff0 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50  .  CHECK_PAGE(pP
1d000 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  g);..  /* If thi
1d010 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76 69  s page was previ
1d020 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1d030 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1d040 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a  , that means.  *
1d050 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c  * we didn't real
1d060 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20 63  ly read in the c
1d070 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
1d080 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  ge.  This can ha
1d090 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65  ppen.  ** (for e
1d0a0 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65  xample) when the
1d0b0 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d   page is being m
1d0c0 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
1d0d0 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20  list.  But.  ** 
1d0e0 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72 68  now we are (perh
1d0f0 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20  aps) moving the 
1d100 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20  page off of the 
1d110 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a  freelist for.  *
1d120 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e  * reuse and we n
1d130 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20  eed to know its 
1d140 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74  original content
1d150 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74   so that content
1d160 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f  .  ** can be sto
1d170 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  red in the rollb
1d180 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f  ack journal.  So
1d190 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74 20   do the read at 
1d1a0 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a  this.  ** time..
1d1b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
1d1c0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
1d1d0 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  g);.  if( rc ){.
1d1e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d1f0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68   }..  /* Mark th
1d200 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
1d210 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
1d220 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
1d230 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
1d240 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
1d250 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
1d260 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
1d270 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
1d280 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
1d290 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e  urnal && (pageIn
1d2a0 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c  Statement(pPg) |
1d2b0 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  | pPager->stmtIn
1d2c0 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70  Use==0) ){.    p
1d2d0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1d2e0 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
1d2f0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
1d300 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
1d310 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1d320 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
1d330 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
1d340 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1d350 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
1d360 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
1d370 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
1d380 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
1d390 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
1d3a0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
1d3b0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1d3c0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
1d3d0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
1d3e0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
1d3f0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1d400 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1d410 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1d420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d430 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
1d440 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1d450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d460 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d470 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1d480 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1d490 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1d4a0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1d4b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
1d4c0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1d4d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
1d4e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1d4f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1d500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d510 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1d520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1d530 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1d540 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
1d550 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1d560 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  ;.    pPager->di
1d570 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
1d580 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e  .    /* The tran
1d590 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1d5a0 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 77  now exists and w
1d5b0 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56 45  e have a RESERVE
1d5c0 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D or an.    ** E
1d5d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1d5e0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1d5f0 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  se file.  Write 
1d600 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1d610 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74   to.    ** the t
1d620 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1d630 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  al if it is not 
1d640 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20  there already.. 
1d650 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
1d660 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
1d670 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   (pPager->useJou
1d680 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29  rnal || MEMDB) )
1d690 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 74  {.      if( (int
1d6a0 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
1d6b0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1d6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1d6d0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66  szPg;.        if
1d6e0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1d6f0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1d700 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1d710 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1d720 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  r);.          PA
1d730 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e  GERTRACE3("JOURN
1d740 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1d750 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d760 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1d770 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1d780 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
1d790 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
1d7a0 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
1d7b0 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
1d7c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1d7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d7e0 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1d800 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
1d810 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1d820 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1d830 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1d840 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1d850 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
1d860 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20   cksum, saved;. 
1d870 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70           char *p
1d880 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20  Data2, *pEnd;.  
1d890 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68          /* We sh
1d8a0 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65  ould never write
1d8b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1d8c0 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68  file the page th
1d8d0 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  at.          ** 
1d8e0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
1d8f0 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68  abase locks.  Th
1d900 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1d910 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20  rt verifies.    
1d920 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65        ** that we
1d930 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20   do not. */.    
1d940 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1d950 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d  g->pgno!=PAGER_M
1d960 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
1d970 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61 74  ;.          pDat
1d980 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1d990 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1d9a0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
1d9b0 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
1d9c0 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
1d9d0 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20  (u8*)pData2);.  
1d9e0 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70          pEnd = p
1d9f0 44 61 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e  Data2 + pPager->
1da00 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
1da10 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b      pData2 -= 4;
1da20 0a 20 20 20 20 20 20 20 20 20 20 73 61 76 65 64  .          saved
1da30 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a   = *(u32*)pEnd;.
1da40 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32 62            put32b
1da50 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29  its(pEnd, cksum)
1da60 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67  ;.          szPg
1da70 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
1da80 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20  ize+8;.         
1da90 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61   put32bits(pData
1daa0 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  2, pPg->pgno);. 
1dab0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1dac0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1dad0 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
1dae0 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20  , szPg);.       
1daf0 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55     IOTRACE(("JOU
1db00 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c  T %p %d %lld %d\
1db10 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1db20 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  >pgno,.         
1db30 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1db40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a  ->journalOff, sz
1db50 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
1db60 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1db70 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
1db80 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
1db90 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1dba0 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
1dbb0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1dbc0 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE5("JOURNAL %d 
1dbd0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
1dbe0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
1dbf0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1dc00 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1dc10 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1dc20 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67  g->needSync, pag
1dc30 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1dc40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75  );.          *(u
1dc50 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64  32*)pEnd = saved
1dc60 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f  ;...  /* An erro
1dc70 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72  r has occured wr
1dc80 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
1dc90 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a  rnal file. The .
1dca0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61            ** tra
1dcb0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
1dcc0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20   rolled back by 
1dcd0 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e  the layer above.
1dce0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
1dcf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1dd00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dd10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dd20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rc;.          }.
1dd30 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1dd40 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
1dd50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1dd60 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
1dd70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1dd80 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1dd90 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
1dda0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1ddb0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
1ddc0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1ddd0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
1dde0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
1ddf0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1de00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1de10 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1de20 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1de30 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1de40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1de50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1de60 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
1de70 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
1de80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1de90 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
1dea0 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
1deb0 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50 50  PAGERTRACE4("APP
1dec0 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20 6e  END %d page %d n
1ded0 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20  eedSync=%d\n",. 
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1def0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1df00 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
1df10 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
1df20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50 67   }.      if( pPg
1df30 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1df40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
1df50 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1df60 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69    }.      pPg->i
1df70 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1df80 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
1df90 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1dfa0 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61  ournal is open a
1dfb0 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  nd the page is n
1dfc0 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a  ot in it,.    **
1dfd0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20   then write the 
1dfe0 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20  current page to 
1dff0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
1e000 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61  urnal.  Note tha
1e010 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  t.    ** the sta
1e020 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66  tement journal f
1e030 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72  ormat differs fr
1e040 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  om the standard 
1e050 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20  journal format. 
1e060 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74     ** in that it
1e070 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b   omits the check
1e080 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61  sums and the hea
1e090 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  der..    */.    
1e0a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1e0b0 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20 21  InUse .     && !
1e0c0 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
1e0d0 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28 69  pPg) .     && (i
1e0e0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
1e0f0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
1e100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73      ){.      ass
1e110 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1e120 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
1e130 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1e140 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1e150 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1e160 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1e170 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1e180 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1e190 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
1e1a0 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
1e1b0 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
1e1c0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1e1d0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1e1e0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1e1f0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
1e200 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1e210 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1e220 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
1e230 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1e240 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1e250 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
1e260 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1e270 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1e280 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1e290 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e2a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1e2b0 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
1e2c0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
1e2d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1e2e0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
1e2f0 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1e300 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1e310 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20  ->pgno, 7)-4;.  
1e320 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1e330 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
1e340 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
1e350 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1e360 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
1e370 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
1e380 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
1e390 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1e3a0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1e3b0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1e3c0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1e3d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1e3e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e3f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1e400 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1e410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
1e420 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b  ger->stmtNRec++;
1e430 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1e440 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e450 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
1e460 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
1e470 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1e480 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1e490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e4a0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
1e4b0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
1e4c0 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
1e4d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1e4e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1e4f0 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66  R_SHARED );.  if
1e500 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1e510 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  <(int)pPg->pgno 
1e520 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
1e530 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e  bSize = pPg->pgn
1e540 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  o;.    if( !MEMD
1e550 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  B && pPager->dbS
1e560 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ize==PENDING_BYT
1e570 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  E/pPager->pageSi
1e580 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ze ){.      pPag
1e590 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
1e5a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e5b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1e5c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1e5d0 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61  sed to mark a da
1e5e0 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74 61  ta-page as writa
1e5f0 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a  ble. It uses .**
1e600 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 74   pager_write() t
1e610 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  o open a journal
1e620 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73 20   file (if it is 
1e630 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
1e640 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  ).** and write t
1e650 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20 74  he page *pData t
1e660 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
1e670 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
1e680 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
1e690 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61   function and pa
1e6a0 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 74  ger_write() is t
1e6b0 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  hat this.** func
1e6c0 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20  tion also deals 
1e6d0 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
1e6e0 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f 72   case where 2 or
1e6f0 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66   more pages.** f
1e700 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64  it on a single d
1e710 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74  isk sector. In t
1e720 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d  his case all co-
1e730 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a  resident pages.*
1e740 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
1e750 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1e760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66  journal file bef
1e770 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1e780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e790 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  erWrite(DbPage *
1e7a0 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  pDbPage){.  int 
1e7b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1e7c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1e7d0 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
1e7e0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1e7f0 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e  pPager;.  Pgno n
1e800 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20  PagePerSector = 
1e810 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  (pPager->sectorS
1e820 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  ize/pPager->page
1e830 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d  Size);..  if( !M
1e840 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65 72  EMDB && nPagePer
1e850 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20  Sector>1 ){.    
1e860 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b  Pgno nPageCount;
1e870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
1e880 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
1e890 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 66  es in database f
1e8a0 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ile */.    Pgno 
1e8b0 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  pg1;            
1e8c0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
1e8d0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
1e8e0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
1e8f0 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  on. */.    int n
1e900 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
1e910 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1e920 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67  f pages starting
1e930 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e   at pg1 to journ
1e940 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  al */.    int ii
1e950 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68  ;..    /* Set th
1e960 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67  e doNotSync flag
1e970 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62   to 1. This is b
1e980 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74  ecause we cannot
1e990 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c   allow a journal
1e9a0 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74  .    ** header t
1e9b0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74  o be written bet
1e9c0 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a  ween the pages j
1e9d0 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73  ournaled by this
1e9e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
1e9f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1ea00 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1ea10 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
1ea20 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b  ->doNotSync = 1;
1ea30 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72  ..    /* This tr
1ea40 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74  ick assumes that
1ea50 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73   both the page-s
1ea60 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73  ize and sector-s
1ea70 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61  ize are.    ** a
1ea80 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20  n integer power 
1ea90 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61  of 2. It sets va
1eaa0 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68  riable pg1 to th
1eab0 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20  e identifier.   
1eac0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
1ead0 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63   page of the sec
1eae0 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74  tor pPg is locat
1eaf0 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ed on..    */.  
1eb00 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70    pg1 = ((pPg->p
1eb10 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65  gno-1) & ~(nPage
1eb20 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20  PerSector-1)) + 
1eb30 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75  1;..    nPageCou
1eb40 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  nt = sqlite3Page
1eb50 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1eb60 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  r);.    if( pPg-
1eb70 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74  >pgno>nPageCount
1eb80 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1eb90 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70  = (pPg->pgno - p
1eba0 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  g1)+1;.    }else
1ebb0 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50   if( (pg1+nPageP
1ebc0 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67  erSector-1)>nPag
1ebd0 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20  eCount ){.      
1ebe0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75  nPage = nPageCou
1ebf0 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65  nt+1-pg1;.    }e
1ec00 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  lse{.      nPage
1ec10 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f   = nPagePerSecto
1ec20 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  r;.    }.    ass
1ec30 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20  ert(nPage>0);.  
1ec40 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50    assert(pg1<=pP
1ec50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
1ec60 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29  sert((pg1+nPage)
1ec70 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  >pPg->pgno);..  
1ec80 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
1ec90 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49  Page && rc==SQLI
1eca0 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20  TE_OK; ii++){.  
1ecb0 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67      Pgno pg = pg
1ecc0 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  1+ii;.      if( 
1ecd0 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  !pPager->aInJour
1ece0 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e  nal || pg==pPg->
1ecf0 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20  pgno || .       
1ed00 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72     pg>pPager->or
1ed10 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50  igDbSize || !(pP
1ed20 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1ed30 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37  [pg/8]&(1<<(pg&7
1ed40 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20  ))).      ) {.  
1ed50 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41        if( pg!=PA
1ed60 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1ed70 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  er) ){.         
1ed80 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20   PgHdr *pPage;. 
1ed90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1eda0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1edb0 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65  ager, pg, &pPage
1edc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1edd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ede0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1edf0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1ee00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1ee10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ee20 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
1ee30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ee40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ee50 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ..    assert( pP
1ee60 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d  ager->doNotSync=
1ee70 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =1 );.    pPager
1ee80 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b  ->doNotSync = 0;
1ee90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1eea0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70   = pager_write(p
1eeb0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  DbPage);.  }.  r
1eec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1eed0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
1eee0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
1eef0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
1ef00 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1ef10 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
1ef20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1ef30 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1ef40 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
1ef50 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
1ef60 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
1ef70 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
1ef80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1ef90 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
1efa0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
1efb0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1efc0 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
1efd0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
1efe0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1eff0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
1f000 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
1f010 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
1f020 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
1f030 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
1f040 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
1f050 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1f060 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61  agerOverwrite(Pa
1f070 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1f080 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
1f090 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
1f0a0 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
1f0b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f0c0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67  erGet(pPager, pg
1f0d0 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28  no, &pPg);.  if(
1f0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1f0f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1f100 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67  e3PagerWrite(pPg
1f110 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1f120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f130 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33    memcpy(sqlite3
1f140 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 67  PagerGetData(pPg
1f150 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  ), pData, pPager
1f160 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1f170 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61   }.    sqlite3Pa
1f180 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1f190 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1f1a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1f1b0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1f1c0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1f1d0 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69   pager that it i
1f1e0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
1f1f0 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20  to.** write the 
1f200 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70  information on p
1f210 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20  age pPg back to 
1f220 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74  the disk, even t
1f230 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61  hough.** that pa
1f240 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b  ge might be mark
1f250 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a  ed as dirty..**.
1f260 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67  ** The overlying
1f270 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20   software layer 
1f280 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1f290 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74  ne when all of t
1f2a0 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68  he data.** on th
1f2b0 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73 20  e given page is 
1f2c0 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61 67  unused.  The pag
1f2d0 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67  er marks the pag
1f2e0 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a  e as clean so.**
1f2f0 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f   that it does no
1f300 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f  t get written to
1f310 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73   disk..**.** Tes
1f320 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68 69  ts show that thi
1f330 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20  s optimization, 
1f340 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74 68  together with th
1f350 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
1f360 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1f370 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
1f380 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
1f390 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
1f3a0 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
1f3b0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
1f3c0 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
1f3d0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
1f3e0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
1f3f0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
1f400 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1f410 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
1f420 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
1f430 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1f440 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1f450 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65  k() for the same
1f460 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68   page.** will th
1f470 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f  ereafter be igno
1f480 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65  red.  This is ne
1f490 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64  cessary to avoid
1f4a0 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68   a problem.** wh
1f4b0 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20  ere a page with 
1f4c0 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f  data is added to
1f4d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
1f4e0 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66  ring one part of
1f4f0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
1f500 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66  n then removed f
1f510 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
1f520 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20   during a later 
1f530 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73  part.** of the s
1f540 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ame transaction 
1f550 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73  and reused for s
1f560 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1f570 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69  e.  When it.** i
1f580 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f  s first added to
1f590 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74   the freelist, t
1f5a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1f5b0 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75  alled.  When reu
1f5c0 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69  sed,.** the sqli
1f5d0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1f5e0 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69  back() routine i
1f5f0 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62  s called.  But b
1f600 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61  ecause the.** pa
1f610 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74  ge contains crit
1f620 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74  ical data, we st
1f630 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
1f640 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72  ure it gets.** r
1f650 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
1f660 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ite of the sqlit
1f670 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1f680 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
1f690 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
1f6a0 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67 65  DontWrite(DbPage
1f6b0 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67   *pDbPage){.  Pg
1f6c0 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61  Hdr *pPg = pDbPa
1f6d0 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ge;.  Pager *pPa
1f6e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1f6f0 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  r;..  if( MEMDB 
1f700 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d  ) return;.  pPg-
1f710 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1f720 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
1f730 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72  dirty && !pPager
1f740 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1f750 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1f760 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1f770 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1f780 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1f790 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ==(int)pPg->pgno
1f7a0 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   && pPager->orig
1f7b0 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64  DbSize<pPager->d
1f7c0 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  bSize ){.      /
1f7d0 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20  * If this pages 
1f7e0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1f7f0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   in the file and
1f800 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72   the file has gr
1f810 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72  own.      ** dur
1f820 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
1f830 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1f840 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68  n do NOT mark th
1f850 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e  e page as clean.
1f860 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74  .      ** When t
1f870 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f880 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20   grows, we must 
1f890 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
1f8a0 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20  he last page.   
1f8b0 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74     ** gets writt
1f8c0 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  en at least once
1f8d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73   so that the dis
1f8e0 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74  k file will be t
1f8f0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20  he correct.     
1f900 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75   ** size. If you
1f910 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68   do not write th
1f920 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  is page and the 
1f930 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1f940 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  .      ** on the
1f950 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65   disk ends up be
1f960 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74  ing too small, t
1f970 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  hat can lead to 
1f980 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
1f990 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72  * corruption dur
1f9a0 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61  ing the next tra
1f9b0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1f9c0 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
1f9d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1f9e0 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
1f9f0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
1fa00 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
1fa10 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1fa20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
1fa30 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1fa40 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
1fa50 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
1fa60 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Pg);.#ifdef SQLI
1fa70 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1fa80 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
1fa90 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
1faa0 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
1fab0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1fac0 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68  .** A call to th
1fad0 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73  is routine tells
1fae0 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20   the pager that 
1faf0 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  if a rollback oc
1fb00 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e  curs,.** it is n
1fb10 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
1fb20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
1fb30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
1fb40 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61  ge.  This.** mea
1fb50 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1fb60 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  r does not have 
1fb70 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69  to record the gi
1fb80 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a  ven page in the.
1fb90 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  ** rollback jour
1fba0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65  nal..**.** If we
1fbb0 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63   have not yet ac
1fbc0 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20  tually read the 
1fbd0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
1fbe0 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20  page (if.** the 
1fbf0 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
1fc00 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65 6e  lag is set) then
1fc10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   this routine ac
1fc20 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a  ts as a promise.
1fc30 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  ** that we will 
1fc40 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65  never need to re
1fc50 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ad the page cont
1fc60 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  ent in the futur
1fc70 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65  e..** so the nee
1fc80 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62  dRead flag can b
1fc90 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68 69  e cleared at thi
1fca0 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  s point..*/.void
1fcb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1fcc0 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
1fcd0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1fce0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1fcf0 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
1fd00 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1fd10 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1fd20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1fd30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1fd40 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1fd50 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1fd60 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
1fd70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1fd80 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1fd90 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
1fda0 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1fdb0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1fdc0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1fdd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1fde0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1fdf0 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1fe00 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1fe10 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1fe20 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1fe30 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1fe40 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d  al = 1;.    pPg-
1fe50 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1fe60 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1fe70 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1fe80 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1fe90 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
1fea0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
1feb0 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41  7);.    }.    PA
1fec0 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1fed0 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64  ROLLBACK page %d
1fee0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e   of %d\n", pPg->
1fef0 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
1ff00 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52  ager));.    IOTR
1ff10 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25 70  ACE(("GARBAGE %p
1ff20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
1ff30 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a  pPg->pgno)).  }.
1ff40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1ff50 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21  mtInUse .   && !
1ff60 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28  pageInStatement(
1ff70 70 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74  pPg) .   && (int
1ff80 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1ff90 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
1ffa0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ffb0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1ffc0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1ffd0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ffe0 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
1fff0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
20000 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
20010 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
20020 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
20030 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
20040 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
20050 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
20060 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
20070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20080 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
20090 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
200a0 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
200b0 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
200c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
200d0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
200e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
200f0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72  .  PgHdr *pPgHdr
20100 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63  ;.  u32 change_c
20110 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63  ounter;.  int rc
20120 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ;..  if( !pPager
20130 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
20140 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
20150 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66   page 1 of the f
20160 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e  ile for writing.
20170 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
20180 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
20190 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29  ger, 1, &pPgHdr)
201a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
201b0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
201c0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
201d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
201e0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
201f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20200 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20   return rc;.  . 
20210 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
20220 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72  the value just r
20230 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74  ead and write it
20240 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34   back to byte 24
20250 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f  . */.    change_
20260 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
20270 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
20280 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
20290 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65 5f 63  s);.    change_c
202a0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
202b0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
202c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
202d0 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
202e0 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  e_counter);.    
202f0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
20300 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
20310 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
20320 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
20330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
20340 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
20350 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20360 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20370 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
20380 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
20390 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
203a0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
203b0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
203c0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
203d0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
203e0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
203f0 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
20400 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
20410 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
20420 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
20430 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
20440 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
20450 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
20460 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
20470 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
20480 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
20490 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
204a0 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
204b0 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
204c0 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
204d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
204e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
204f0 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
20500 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
20510 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
20520 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
20530 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
20540 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20550 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
20560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
20570 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
20580 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
20590 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
205a0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
205b0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
205c0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
205d0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
205e0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
205f0 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
20600 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
20610 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
20620 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
20630 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
20640 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
20650 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
20660 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
20670 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
20680 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
20690 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
206a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
206b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
206c0 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
206d0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
206e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52  ITE_OK;..  PAGER
206f0 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
20700 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
20710 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
20720 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
20730 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
20740 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
20750 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
20760 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
20770 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
20780 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
20790 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
207a0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
207b0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
207c0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
207d0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
207e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
207f0 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
20800 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
20810 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
20820 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
20830 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20840 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20850 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
20860 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20870 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
20880 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
20890 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
208a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
208b0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
208c0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
208d0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
208e0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
208f0 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
20900 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
20910 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
20920 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
20930 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
20940 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
20950 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
20960 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
20970 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
20980 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
20990 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
209a0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
209b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
209c0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
209d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
209e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
209f0 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
20a00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20a10 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
20a20 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
20a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20a40 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
20a50 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
20a60 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
20a70 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
20a80 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
20a90 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
20aa0 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
20ab0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
20ac0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
20ad0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
20ae0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
20af0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
20b00 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
20b10 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
20b20 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
20b30 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
20b40 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
20b50 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
20b60 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
20b70 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
20b80 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
20b90 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
20ba0 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
20bb0 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
20bc0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
20bd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20be0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
20bf0 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
20c00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20c10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20c20 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20c30 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20c40 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20c50 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
20c60 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20c70 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20c80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20c90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20ca0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20cb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20cc0 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
20cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
20ce0 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
20cf0 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
20d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20d10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20d20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20d30 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
20d40 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
20d50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d60 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
20d70 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  xit;.    }..#ifn
20d80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20d90 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
20da0 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
20db0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20dc0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
20dd0 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
20de0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20df0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20e00 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
20e10 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
20e20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
20e30 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
20e40 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20e50 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
20e60 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
20e70 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
20e80 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
20e90 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
20ea0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20eb0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
20ec0 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65  _exit;.    pPage
20ed0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a  r->pDirty = 0;..
20ee0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
20ef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
20f00 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
20f10 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
20f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20f30 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
20f40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
20f50 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
20f60 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
20f70 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
20f80 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
20f90 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
20fa0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
20fb0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
20fc0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20fd0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
20fe0 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
20ff0 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
21000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
21010 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
21020 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
21030 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
21040 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
21050 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
21060 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
21070 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
21080 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
21090 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
210a0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
210b0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
210c0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
210d0 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a  ent, it's.     *
210e0 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
210f0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
21100 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
21110 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
21120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21130 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
21140 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
21150 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
21160 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
21170 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
21180 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
21190 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
211a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
211b0 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
211c0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
211d0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
211e0 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
211f0 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
21200 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
21210 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21220 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
21230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21240 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
21250 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
21260 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21270 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
21280 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
21290 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
212a0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
212b0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
212c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
212d0 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
212e0 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
212f0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21300 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
21310 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
21320 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
21330 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
21340 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
21350 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
21360 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
21370 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
21380 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c  Pager);.      cl
21390 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
213a0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
213b0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
213c0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
213d0 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
213e0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
213f0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
21400 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21410 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
21420 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
21430 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
21440 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
21450 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
21460 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64  Dirty = 0;.#ifnd
21470 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
21480 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
21490 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
214a0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
214b0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
214c0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
214d0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
214e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
214f0 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
21500 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
21510 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
21520 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
21530 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
21540 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
21550 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
21560 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
21570 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
21580 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
21590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
215a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
215b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
215c0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
215d0 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
215e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
215f0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
21600 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  CED || !pPager->
21610 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
21620 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
21630 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
21640 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  r);.  return pag
21650 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
21660 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
21670 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
21680 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
21690 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
216a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
216b0 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
216c0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
216d0 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
216e0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
216f0 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
21700 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
21710 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
21720 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
21730 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
21740 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
21750 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
21760 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
21770 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72  king protocol or
21780 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
21790 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
217a0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
217b0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
217c0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
217d0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
217e0 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
217f0 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
21800 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
21810 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
21820 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
21830 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
21840 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
21850 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
21860 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21870 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
21880 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
21890 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
218a0 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52   int rc;.  PAGER
218b0 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
218c0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
218d0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
218e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
218f0 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
21900 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
21910 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
21920 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
21930 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
21940 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
21950 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
21960 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
21970 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
21980 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
21990 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
219a0 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
219b0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
219c0 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
219d0 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
219e0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
219f0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
21a00 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21a10 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
21a20 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21a30 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
21a40 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
21a50 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
21a60 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
21a70 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
21a80 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
21a90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
21aa0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52    PAGERTRACE3("R
21ab0 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
21ac0 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
21ad0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
21ae0 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
21af0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
21b00 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
21b10 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
21b20 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
21b30 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
21b40 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
21b50 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
21b60 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
21b70 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
21b80 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
21b90 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
21ba0 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21bb0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
21bc0 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
21bd0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
21be0 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
21bf0 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
21c00 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20  r->xReiniter(p, 
21c10 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21c20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21c30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
21c40 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
21c50 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
21c60 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
21c70 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
21c80 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67  gDbSize;.    pag
21c90 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
21ca0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
21cb0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21cc0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21cd0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
21ce0 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
21cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21d00 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
21d10 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
21d20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
21d30 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
21d40 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
21d50 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
21d60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21d70 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
21d80 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
21d90 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
21da0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
21db0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21dc0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
21dd0 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
21de0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
21df0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
21e00 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21e10 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
21e20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21e30 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
21e40 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
21e50 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
21e60 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
21e70 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
21e80 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
21e90 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
21ea0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
21ec0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
21ed0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
21ee0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
21ef0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
21f00 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
21f10 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
21f20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
21f30 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
21f40 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
21f50 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
21f60 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
21f70 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
21f80 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
21f90 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
21fa0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
21fb0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
21fc0 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
21fd0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ent..  */.  retu
21fe0 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
21ff0 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
22000 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
22010 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
22020 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
22030 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
22040 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
22050 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
22060 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
22070 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
22080 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
22090 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
220a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
220b0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
220c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
220d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
220e0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
220f0 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
22100 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
22110 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22120 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22130 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
22140 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
22150 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22160 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
22170 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
22180 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
22190 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
221a0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
221b0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
221c0 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
221d0 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
221e0 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
221f0 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
22200 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
22210 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
22220 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
22230 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
22240 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
22250 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
22260 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
22270 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
22280 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
22290 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
222a0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
222b0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
222c0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
222d0 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
222e0 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
222f0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22300 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
22310 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
22320 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
22330 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
22340 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
22350 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22360 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
22370 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
22380 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
22390 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
223a0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
223b0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
223c0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
223d0 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
223e0 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
223f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22400 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
22410 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
22420 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
22430 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22440 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
22450 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22460 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
22470 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
22480 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
22490 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
224a0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
224b0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
224c0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
224d0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
224e0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
224f0 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
22500 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
22510 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
22520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22530 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
22540 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
22550 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
22560 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
22570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22580 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
22590 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
225a0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
225b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
225c0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
225d0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
225e0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
225f0 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
22600 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
22610 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
22620 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
22630 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
22640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
22650 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
22660 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
22670 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
22680 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
22690 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
226a0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
226b0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
226c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
226d0 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
226e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
226f0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
22700 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
22710 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22720 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
22730 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
22740 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
22750 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
22760 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
22770 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
22780 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
22790 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
227a0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
227b0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
227c0 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74 66  emp(&pPager->stf
227d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
227e0 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
227f0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
22800 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
22810 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
22820 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
22830 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
22840 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
22850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
22860 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
22870 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
22880 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
22890 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
228a0 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
228b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
228c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
228d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
228e0 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
228f0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
22900 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
22910 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22920 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
22930 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
22940 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
22950 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52  ext;.    PAGERTR
22960 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
22970 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
22980 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
22990 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
229a0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
229b0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
229c0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
229d0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
229e0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
229f0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
22a00 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
22a10 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
22a20 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
22a30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
22a40 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
22a50 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
22a60 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
22a70 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
22a80 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
22a90 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
22aa0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
22ab0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
22ac0 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  tmt;.        ass
22ad0 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74  ert( pHist->inSt
22ae0 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  mt );.        pH
22af0 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
22b00 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
22b10 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
22b20 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
22b30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22b40 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
22b50 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
22b60 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
22b70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22b80 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
22b90 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22ba0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
22bb0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
22bc0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
22bd0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
22be0 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
22bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22c00 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
22c10 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
22c20 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
22c30 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
22c40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
22c50 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
22c60 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
22c70 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
22c80 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
22c90 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
22ca0 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
22cb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
22cc0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
22cd0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
22ce0 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  t;.      for(pPg
22cf0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
22d00 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e  pPg; pPg=pHist->
22d10 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
22d20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
22d30 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
22d40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
22d50 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
22d60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
22d70 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
22d80 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
22d90 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
22da0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
22db0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
22dc0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
22dd0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
22de0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
22df0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22e00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22e10 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
22e20 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72  ize;.      pager
22e30 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
22e40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
22e50 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22e60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22e70 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
22e80 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
22e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22ea0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
22eb0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
22ec0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
22ed0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
22ee0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
22ef0 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
22f00 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
22f10 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
22f20 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
22f30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
22f40 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
22f50 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
22f60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
22f70 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
22f80 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
22f90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22fa0 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
22fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22fc0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
22fd0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
22fe0 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
22ff0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
23000 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
23010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23020 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
23030 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
23040 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
23050 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
23060 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
23070 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
23080 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
23090 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
230a0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
230b0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
230c0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
230d0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
230e0 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
230f0 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
23100 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
23110 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23120 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
23130 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
23140 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
23150 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
23160 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
23170 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
23180 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
23190 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
231a0 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
231b0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
231c0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
231d0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
231e0 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
231f0 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
23200 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
23210 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
23220 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
23230 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
23240 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
23250 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23260 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
23270 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
23280 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
23290 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
232a0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
232b0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
232c0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
232d0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
232e0 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
232f0 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
23300 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
23310 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
23320 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
23330 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
23340 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70  ous located at p
23350 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
23360 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
23370 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
23380 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
23390 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
233a0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
233b0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
233c0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
233d0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
233e0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
233f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23400 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
23410 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
23420 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
23430 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
23440 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
23450 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
23460 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
23470 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
23480 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
23490 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
234a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
234b0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
234c0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
234d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
234e0 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
234f0 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
23500 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
23510 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
23520 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
23530 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
23540 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
23550 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
23560 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
23570 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23580 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
23590 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
235a0 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
235b0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
235c0 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67  Old;  /* The pag
235d0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
235e0 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  ten. */.  int h;
235f0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
23600 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
23610 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
23620 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
23630 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
23640 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
23650 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
23660 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
23670 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
23680 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
23690 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
236a0 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
236b0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
236c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
236d0 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
236e0 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
236f0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
23700 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
23710 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
23720 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
23730 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
23740 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
23750 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
23760 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
23770 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
23780 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
23790 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
237a0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
237b0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
237c0 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
237d0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
237e0 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
237f0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
23800 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
23810 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
23820 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
23830 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
23840 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
23850 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
23860 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
23870 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
23880 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
23890 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
238a0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
238b0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
238c0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
238d0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
238e0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
238f0 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
23900 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
23910 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
23920 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
23930 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
23940 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
23950 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
23960 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b  pPgOld);.    mak
23970 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a  eClean(pPgOld);.
23980 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
23990 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  c = pPgOld->need
239a0 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sync;.  }else{. 
239b0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
239c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
239d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
239e0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
239f0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
23a00 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ize ){.    pPg->
23a10 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50  inJournal =  (pP
23a20 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
23a30 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
23a40 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
23a50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
23a60 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
23a70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
23a80 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28  needSync==0 || (
23a90 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
23aa0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
23ab0 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
23ac0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23ad0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
23ae0 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
23af0 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
23b00 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
23b10 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
23b20 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
23b30 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
23b40 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
23b50 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23b60 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
23b70 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23b80 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
23b90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
23ba0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
23bb0 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
23bc0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
23bd0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23be0 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
23bf0 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
23c00 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
23c10 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
23c20 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
23c30 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
23c40 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
23c50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
23c60 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
23c70 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
23c80 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23c90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
23ca0 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
23cb0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
23cc0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
23cd0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
23ce0 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
23cf0 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
23d00 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
23d10 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
23d20 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
23d30 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f    ** Pager.aInJo
23d40 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
23d50 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
23d60 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
23d70 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
23d80 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
23d90 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
23da0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
23db0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
23dc0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
23dd0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
23de0 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
23df0 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
23e00 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
23e10 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
23e20 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
23e30 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
23e40 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
23e50 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
23e60 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
23e70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23e80 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
23e90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23ea0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
23eb0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
23ec0 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
23ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
23ee0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
23ef0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
23f00 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
23f10 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23f20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
23f30 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
23f40 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
23f50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
23f60 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
23f70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
23f80 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
23f90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23fa0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
23fb0 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
23fc0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
23fd0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
23fe0 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
23ff0 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
24000 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
24010 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
24020 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24030 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
24040 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
24050 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
24060 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
24070 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
24080 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
24090 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
240a0 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
240b0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
240c0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
240d0 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
240e0 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  r?PGHDR_TO_EXTRA
240f0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29  (pPg, pPager):0)
24100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
24110 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
24120 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
24130 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
24140 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
24150 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
24160 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
24170 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24180 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
24190 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
241a0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
241b0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
241c0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
241d0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
241e0 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
241f0 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
24200 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
24210 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
24220 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
24230 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
24240 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
24250 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24260 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
24270 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
24280 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
24290 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
242a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
242b0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
242c0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
242d0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
242e0 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
242f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
24300 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
24310 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
24320 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
24330 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
24340 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
24350 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24360 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
24370 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
24380 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
24390 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
243a0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
243b0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
243c0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
243d0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
243e0 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
243f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
24400 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
24410 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
24420 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
24430 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
24440 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66  siveMode;.}..#if
24450 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24460 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
24470 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
24480 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24490 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
244a0 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
244b0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
244c0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
244d0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
244e0 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
244f0 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
24500 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
24510 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
24520 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
24530 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
24540 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
24550 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
24560 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
24570 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
24580 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
24590 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
245a0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
245b0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
245c0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
245d0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
245e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
245f0 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
24600 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24610 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
24620 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
24630 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
24640 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
24650 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
24660 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
24670 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24680 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
24690 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
246a0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
246b0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
246c0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
246d0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
246e0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
246f0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
24700 20 2a 2f 0a                                       */.