/ Hex Artifact Content
Login

Artifact cdf561d3ae4009be902df714da4518dc3522e206:


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: 35 20 32 30 30 37 2f 30 38 2f 31 31 20 30 30 3a  5 2007/08/11 00:
0360: 32 36 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a  26:21 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 0a 20 20 20 20 20 20 20 70  assert(.       p
60b0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d  Pager->errCode==
60c0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
60d0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
60e0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
60f0: 20 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67   ||.       (pPag
6100: 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78  er->errCode & 0x
6110: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
6120: 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20  R.  );.  if(.   
6130: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   rc2==SQLITE_FUL
6140: 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  L ||.    rc2==SQ
6150: 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20  LITE_IOERR ||.  
6160: 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f    rc2==SQLITE_CO
6170: 52 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70  RRUPT.  ){.    p
6180: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
6190: 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   rc;.  }.  retur
61a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
61b0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
61c0: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
61d0: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
61e0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
61f0: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
6200: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
6210: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
6220: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
6230: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
6240: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
6250: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
6260: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
6270: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
6280: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
6290: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
62a0: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
62b0: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
62c0: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
62d0: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
62e0: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
62f0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6300: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
6310: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
6320: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
6330: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
6340: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
6350: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
6360: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
6370: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
6380: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
6390: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
63a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
63b0: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
63c0: 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f  ed char *)PGHDR_
63d0: 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b  TO_DATA(pPage));
63e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
63f0: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
6400: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
6410: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
6420: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
6430: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
6440: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
6450: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
6460: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
6470: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
6480: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
6490: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
64a0: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
64b0: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
64c0: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
64d0: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
64e0: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
64f0: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
6500: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
6510: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
6520: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
6530: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
6540: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
6550: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
6560: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
6570: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
6580: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
6590: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
65a0: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
65b0: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
65c0: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
65d0: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
65e0: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
65f0: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
6600: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  dif../*.** When 
6610: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
6620: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6630: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
6640: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
6650: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
6660: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
6670: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
6680: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
6690: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
66a0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
66b0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
66c0: 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73  Malloc(). *pzMas
66d0: 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ter is.** set to
66e0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65   point at the me
66f0: 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
6700: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
6710: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
6720: 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a  sqliteFree() *pz
6730: 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  Master..**.** If
6740: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
6750: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
6760: 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65  present *pzMaste
6770: 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  r is set to 0 an
6780: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
6790: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
67a0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
67b0: 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20  rJournal(OsFile 
67c0: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70  *pJrnl, char **p
67d0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
67e0: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
67f0: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
6800: 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  cksum;.  int i;.
6810: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6820: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6830: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6840: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6850: 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  */..  *pzMaster 
6860: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
6870: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
6880: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
6890: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
68a0: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
68b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
68c0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
68d0: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20  rnl, szJ-16);.  
68e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
68f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
6900: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6910: 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b  ts(pJrnl, &len);
6920: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6930: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6940: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
6950: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73  bits(pJrnl, &cks
6960: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
6970: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6980: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
6990: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
69a0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20  l, aMagic, 8);. 
69b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
69c0: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
69d0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
69e0: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
69f0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6a00: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
6a10: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
6a20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6a30: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6a40: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63    *pzMaster = (c
6a50: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
6a60: 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28  oc(len+1);.  if(
6a70: 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20   !*pzMaster ){. 
6a80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6a90: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
6aa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
6ab0: 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65  (pJrnl, *pzMaste
6ac0: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
6ad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6ae0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
6af0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
6b00: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
6b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6b20: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
6b30: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
6b40: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
6b50: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
6b60: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
6b70: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
6b80: 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69  -= (*pzMaster)[i
6b90: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
6ba0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
6bb0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
6bc0: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
6bd0: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
6be0: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
6bf0: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
6c00: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
6c10: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
6c20: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
6c30: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
6c40: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
6c50: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
6c60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
6c70: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
6c80: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
6c90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
6ca0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
6cb0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
6cc0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
6cd0: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
6ce0: 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b      (*pzMaster)[
6cf0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  len] = '\0';.  }
6d00: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
6d10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6d20: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
6d30: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
6d40: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
6d50: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
6d60: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
6d70: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
6d80: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
6d90: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
6da0: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
6db0: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
6dc0: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
6dd0: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
6de0: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
6df0: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
6e10: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e60: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
6e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ea0: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
6eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ec0: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
6ed0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
6ee0: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
6ef0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
6f00: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
6f10: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
6f20: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
6f30: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
6f40: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
6f50: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6f60: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
6f70: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
6f80: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6f90: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
6fa0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
6fb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
6fc0: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
6fd0: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
6fe0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6ff0: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
7000: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
7010: 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20  ffset;.  return 
7020: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
7030: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
7040: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
7050: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
7060: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
7070: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
7080: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7090: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
70a0: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
70b0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
70c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
70d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
70e0: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
70f0: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
7100: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
7110: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
7120: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
7130: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
7140: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
7150: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
7160: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
7170: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
7180: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
7190: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
71a0: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
71b0: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
71c0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
71d0: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
71e0: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
71f0: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
7200: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
7210: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
7220: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
7230: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
7240: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a  s journal..** .*
7250: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
7260: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
7270: 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  24) bytes of unu
7280: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
7290: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
72a0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
72b0: 70 50 61 67 65 72 29 7b 0a 20 20 63 68 61 72 20  pPager){.  char 
72c0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
72d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
72e0: 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
72f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
7300: 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  HdrOff==0 ){.   
7310: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
7320: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
7330: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20  urnalOff;.  }.. 
7340: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
7350: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
7360: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7370: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
7380: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
7390: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
73a0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
73b0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
73c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
73d0: 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20  .  /* FIX ME: . 
73e0: 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c   **.  ** Possibl
73f0: 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f  y for a pager no
7400: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
7410: 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  e, the journal m
7420: 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  agic should not.
7430: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
7440: 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69  until nRec is fi
7450: 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20  lled in as part 
7460: 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72  of next syncJour
7470: 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a  nal(). .  **.  *
7480: 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65  * Actually maybe
7490: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
74a0: 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64  al header should
74b0: 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69   be delayed unti
74c0: 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e  l that.  ** poin
74d0: 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  t. Think about t
74e0: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63  his..  */.  memc
74f0: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
7500: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
7510: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
7520: 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6e 52 65 63  );.  /* The nRec
7530: 20 46 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46   Field. 0xFFFFFF
7540: 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a  FF for no-sync j
7550: 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75  ournals. */.  pu
7560: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7570: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7580: 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
7590: 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66  >noSync ? 0xffff
75a0: 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20  ffff : 0);.  /* 
75b0: 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b  The random check
75c0: 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65  -hash initialise
75d0: 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52  r */ .  sqlite3R
75e0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
75f0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
7600: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
7610: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33  sumInit);.  put3
7620: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
7630: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7640: 67 69 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d  gic)+4], pPager-
7650: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f  >cksumInit);.  /
7660: 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61  * The initial da
7670: 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20  tabase size */. 
7680: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
7690: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
76a0: 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50  nalMagic)+8], pP
76b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20  ager->dbSize);. 
76c0: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
76d0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
76e0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
76f0: 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65    put32bits(&zHe
7700: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7710: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20  rnalMagic)+12], 
7720: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
7730: 7a 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ze);.  IOTRACE((
7740: 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
7750: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
7760: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c  ger->journalHdr,
7770: 20 73 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29   sizeof(zHeader)
7780: 29 29 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  )).  rc = sqlite
7790: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
77a0: 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73  >jfd, zHeader, s
77b0: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 3b  izeof(zHeader));
77c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
77d0: 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65  al header has be
77e0: 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65  en written succe
77f0: 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68  ssfully. Seek th
7800: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
7810: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
7820: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
7830: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7840: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  sector..  */.  i
7850: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7860: 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
7870: 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c  ("JTAIL %p %lld\
7880: 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
7890: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
78a0: 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
78b0: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
78c0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
78d0: 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20  ournalOff-1);.  
78e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
78f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
7900: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
7910: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  (pPager->jfd, "\
7920: 30 30 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  000", 1);.    }.
7930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
7950: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
7960: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
7970: 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  s is called. A j
7980: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
7990: 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48  le.** (JOURNAL_H
79a0: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
79b0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75  read from the cu
79c0: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69  rrent location i
79d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
79e0: 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65   file. See comme
79f0: 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69  nts above functi
7a00: 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  on writeJournalH
7a10: 64 72 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  dr() for a descr
7a20: 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  iption of.** the
7a30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7a40: 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  format..**.** If
7a50: 20 74 68 65 20 68 65 61 64 65 72 20 69 73 20 72   the header is r
7a60: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
7a70: 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74  , *nRec is set t
7a80: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  o the number of.
7a90: 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  ** page records 
7aa0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68  following this h
7ab0: 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a  eader and *dbSiz
7ac0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
7ad0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
7ae0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
7af0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
7b00: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
7b10: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
7b20: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
7b30: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
7b40: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
7b50: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
7b60: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
7b70: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
7b80: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
7b90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
7ba0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
7bb0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
7bc0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
7bd0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52  returned and *nR
7be0: 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61  ec and *dbSize a
7bf0: 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20  re not set.  If 
7c00: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
7c10: 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ytes.** cannot b
7c20: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
7c30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20  journal file an 
7c40: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
7c50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
7c60: 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61  c int readJourna
7c70: 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70  lHdr(.  Pager *p
7c80: 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f  Pager, .  i64 jo
7c90: 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32  urnalSize,.  u32
7ca0: 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20   *pNRec, .  u32 
7cb0: 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e  *pDbSize.){.  in
7cc0: 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
7cd0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
7ce0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
7cf0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
7d00: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d  eader */..  rc =
7d10: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
7d20: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
7d30: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7d40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
7d50: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
7d60: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7d70: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
7d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7d90: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
7da0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7db0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
7dc0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
7dd0: 4d 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72  Magic));.  if( r
7de0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7df0: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
7e00: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
7e10: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
7e20: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
7e30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
7e40: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
7e50: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
7e60: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
7e70: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7e80: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
7e90: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
7ea0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
7eb0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
7ec0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7ed0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
7ee0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
7ef0: 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  DbSize);.  if( r
7f00: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
7f10: 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
7f20: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73  assumed sector-s
7f30: 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65  ize to match the
7f40: 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a   value used by .
7f50: 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
7f60: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
7f70: 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74  is journal. If t
7f80: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a  his journal was.
7f90: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20    ** created by 
7fa0: 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20  a process other 
7fb0: 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74  than this one, t
7fc0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
7fd0: 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63  .  ** is being c
7fe0: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
7ff0: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
8000: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
8010: 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65  lue.  ** of Page
8020: 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20  r.sectorSize is 
8030: 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  restored at the 
8040: 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74  end of that rout
8050: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ine..  */.  rc =
8060: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
8070: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
8080: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
8090: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
80a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
80b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
80c0: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
80d0: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
80e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
80f0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
8100: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8110: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
8120: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
8130: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
8140: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
8150: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
8160: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
8170: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
8180: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8190: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
81a0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
81b0: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
81c0: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
81d0: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
81e0: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
81f0: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
8200: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
8210: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
8220: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
8230: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
8240: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
8250: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
8260: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
8270: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
8280: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
8290: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
82a0: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
82b0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
82c0: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
82d0: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
82e0: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
82f0: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
8300: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
8310: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
8320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
8330: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
8340: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
8350: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
8360: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
8370: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
8380: 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72  **.** If zMaster
8390: 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
83a0: 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61  er (occurs for a
83b0: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
83c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a   transaction), .
83d0: 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  ** this call is 
83e0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
83f0: 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74  ic int writeMast
8400: 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  erJournal(Pager 
8410: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63  *pPager, const c
8420: 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
8430: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c   int rc;.  int l
8440: 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20  en; .  int i; . 
8450: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a   u32 cksum = 0;.
8460: 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65    char zBuf[size
8470: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
8480: 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21  )+2*4];..  if( !
8490: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
84a0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
84b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
84c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
84d0: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
84e0: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
84f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
8500: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
8510: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
8520: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
8530: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
8540: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
8550: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
8560: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
8570: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
8580: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
8590: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
85a0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
85b0: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
85c0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
85d0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
85e0: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
85f0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
8600: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
8610: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
8620: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
8630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8640: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
8650: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8660: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
8670: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
8680: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
8690: 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  , PAGER_MJ_PGNO(
86a0: 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
86b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
86c0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
86d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
86e0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
86f0: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
8700: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8710: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
8720: 20 20 70 75 74 33 32 62 69 74 73 28 7a 42 75 66    put32bits(zBuf
8730: 2c 20 6c 65 6e 29 3b 0a 20 20 70 75 74 33 32 62  , len);.  put32b
8740: 69 74 73 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b  its(&zBuf[4], ck
8750: 73 75 6d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  sum);.  memcpy(&
8760: 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61  zBuf[8], aJourna
8770: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
8780: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8790: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
87a0: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
87b0: 64 2c 20 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f  d, zBuf, 8+sizeo
87c0: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
87d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  );.  pPager->nee
87e0: 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
87f0: 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72  >noSync;.  retur
8800: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
8810: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
8820: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
8830: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
8840: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
8850: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
8860: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
8870: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
8880: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
8890: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
88a0: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
88b0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
88c0: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
88d0: 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  the sqlite3Pager
88e0: 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20  StmtCommit().** 
88f0: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
8900: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
8910: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
8920: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
8930: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
8940: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
8950: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
8960: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
8970: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8980: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
8990: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
89a0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
89b0: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
89c0: 3b 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70  ;.  PgHistory *p
89d0: 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
89e0: 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
89f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d  );.  assert( MEM
8a00: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69  DB );.  if( !pHi
8a10: 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20  st->inStmt ){.  
8a20: 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
8a30: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
8a40: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
8a50: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  t==0 );.    if( 
8a60: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
8a70: 0a 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f  .      PGHDR_TO_
8a80: 48 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74  HIST(pPager->pSt
8a90: 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72  mt, pPager)->pPr
8aa0: 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  evStmt = pPg;.  
8ab0: 20 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70    }.    pHist->p
8ac0: 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65  NextStmt = pPage
8ad0: 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50  r->pStmt;.    pP
8ae0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
8af0: 67 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  g;.    pHist->in
8b00: 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  Stmt = 1;.  }.}.
8b10: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
8b20: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
8b30: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
8b40: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
8b50: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
8b60: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
8b70: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
8b80: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
8b90: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
8ba0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8bb0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
8bc0: 48 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50  Hdr *p;.  if( pP
8bd0: 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29  ager->aHash==0 )
8be0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d   return 0;.  p =
8bf0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
8c00: 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
8c10: 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c  Hash-1)];.  whil
8c20: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
8c30: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
8c40: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
8c50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8c60: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
8c70: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8c80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8c90: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61   pager_unlock(Pa
8ca0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
8cb0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
8cc0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
8cd0: 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
8ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
8cf0: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
8d00: 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
8d10: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
8d20: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54   = -1;.      IOT
8d30: 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70  RACE(("UNLOCK %p
8d40: 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
8d50: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
8d60: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
8d70: 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65 72  LOCK;.    pPager
8d80: 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
8d90: 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
8da0: 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f  .** Execute a ro
8db0: 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e  llback if a tran
8dc0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
8dd0: 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65  e and unlock the
8de0: 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69   .** database fi
8df0: 6c 65 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  le. This is a no
8e00: 2d 6f 70 20 69 66 20 74 68 65 20 70 61 67 65 72  -op if the pager
8e10: 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74   has already ent
8e20: 65 72 65 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f  ered.** the erro
8e30: 72 2d 73 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  r-state..*/.stat
8e40: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
8e50: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
8e60: 61 67 65 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  ager *p){.  if( 
8e70: 70 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65 74  p->errCode ) ret
8e80: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
8e90: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
8ea0: 45 53 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f  ESERVED || p->jo
8eb0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
8ec0: 20 20 69 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d    if( p->state>=
8ed0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
8ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
8ef0: 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  erRollback(p);. 
8f00: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
8f10: 6b 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  k(p);.  assert( 
8f20: 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70  p->errCode || !p
8f30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
8f40: 20 28 70 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f   (p->exclusiveMo
8f50: 64 65 26 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  de&&!p->journalO
8f60: 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
8f70: 20 70 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21   p->errCode || !
8f80: 70 2d 3e 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70  p->stmtOpen || p
8f90: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8fa0: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  );.}.../*.** Cle
8fb0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
8fc0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
8fd0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
8fe0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
8ff0: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
9000: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
9010: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
9020: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
9030: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
9040: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
9050: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
9060: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
9070: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
9080: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
9090: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
90a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
90b0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
90c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
90d0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
90e0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
90f0: 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b  rrCode ) return;
9100: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
9110: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
9120: 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f  g=pNext){.    IO
9130: 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
9140: 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
9150: 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
9160: 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
9170: 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
9180: 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e  e_count);.    pN
9190: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
91a0: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
91b0: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
91c0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
91d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
91e0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
91f0: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
9200: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
9210: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
9220: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
9230: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
9240: 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  0;.  sqliteFree(
9250: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
9260: 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20    pPager->nPage 
9270: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
9280: 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61 67  Hash = 0;.  pPag
9290: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a  er->nRef = 0;.}.
92a0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
92b0: 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61 6e 73  ine ends a trans
92c0: 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73  action.  A trans
92d0: 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
92e0: 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61 20 43  by either.** a C
92f0: 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42  OMMIT or a ROLLB
9300: 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ACK..**.** When 
9310: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9320: 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
9330: 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  r has the journa
9340: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a  l file open and.
9350: 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ** a RESERVED or
9360: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
9370: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
9380: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
9390: 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  ill release.** t
93a0: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
93b0: 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
93c0: 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69  SHARED lock in i
93d0: 74 73 20 70 6c 61 63 65 20 69 66 20 74 68 61 74  ts place if that
93e0: 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f   is.** the appro
93f0: 70 72 69 61 74 65 20 74 68 69 6e 67 20 74 6f 20  priate thing to 
9400: 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c 6f 63  do.  Release loc
9410: 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20 61 70  ks usually is ap
9420: 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e  propriate,.** un
9430: 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e 20 65  less we are in e
9440: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
9450: 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73 20 74  mode or unless t
9460: 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d  his is a .** COM
9470: 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20 6f 72  MIT AND BEGIN or
9480: 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45   ROLLBACK AND BE
9490: 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  GIN operation..*
94a0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
94b0: 20 66 69 6c 65 20 69 73 20 65 69 74 68 65 72 20   file is either 
94c0: 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75 6e 63  deleted or trunc
94d0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f  ated..**.** TODO
94e0: 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70 69  : Consider keepi
94f0: 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
9500: 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d  ile open for tem
9510: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
9520: 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20  ..** This might 
9530: 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e  give a performan
9540: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f  ce improvement o
9550: 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65 20  n windows where 
9560: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c  opening.** a fil
9570: 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69 76  e is an expensiv
9580: 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  e operation..*/.
9590: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
95a0: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
95b0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
95c0: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
95d0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
95e0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d  _OK;.  int rc2 =
95f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
9600: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
9610: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9620: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
9630: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
9640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
9650: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74    sqlite3PagerSt
9660: 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  mtCommit(pPager)
9670: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9680: 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61  stmtOpen && !pPa
9690: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
96a0: 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
96b0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
96c0: 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61  ->stfd);.    pPa
96d0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
96e0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
96f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
9700: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
9710: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
9720: 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  e .          && 
9730: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54  (rc = sqlite3OsT
9740: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
9750: 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45  jfd, 0))==SQLITE
9760: 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 73 71  _OK ){;.      sq
9770: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
9780: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
9790: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
97a0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
97b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
97c0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
97d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
97e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
97f0: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
9800: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
9810: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
9820: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9830: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
9840: 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
9850: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
9860: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nal);.      }.  
9870: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
9880: 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ee( pPager->aInJ
9890: 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
98a0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
98b0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50   = 0;.    for(pP
98c0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
98d0: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
98e0: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
98f0: 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
9900: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  0;.      pPg->di
9910: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
9920: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
9930: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77  ;.      pPg->alw
9940: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
9950: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
9960: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
9970: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9980: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
9990: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
99a0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
99b0: 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
99c0: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
99d0: 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
99e0: 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  r->nRec = 0;.  }
99f0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
9a00: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
9a10: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61  rnal==0 );.    a
9a20: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
9a30: 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20  irtyCache==0 || 
9a40: 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
9a50: 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20  al==0 );.  }..  
9a60: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
9a70: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
9a80: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 4f    rc2 = sqlite3O
9a90: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
9aa0: 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
9ab0: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
9ac0: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
9ad0: 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
9ae0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
9af0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
9b00: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
9b10: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
9b20: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
9b30: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30  ->origDbSize = 0
9b40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
9b50: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
9b60: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
9b70: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
9b80: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
9b90: 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 50  er->pFirst;.  pP
9ba0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
9bb0: 31 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63  1;..  return (rc
9bc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a  ==SQLITE_OK?rc2:
9bd0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc);.}../*.** Co
9be0: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
9bf0: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
9c00: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
9c10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9c20: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
9c30: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
9c40: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
9c50: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
9c60: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
9c70: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
9c80: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
9c90: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
9ca0: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
9cb0: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
9cc0: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
9cd0: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
9ce0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
9cf0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
9d00: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
9d10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
9d20: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
9d30: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
9d40: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
9d50: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
9d60: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
9d70: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
9d80: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
9d90: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
9da0: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
9db0: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
9dc0: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
9dd0: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
9de0: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
9df0: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
9e00: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
9e10: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
9e20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
9e30: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
9e40: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
9e50: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
9e60: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
9e70: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
9e80: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
9e90: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
9ea0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
9eb0: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
9ec0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
9ed0: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
9ee0: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
9ef0: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
9f00: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
9f10: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
9f20: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
9f30: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
9f40: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
9f50: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
9f60: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
9f70: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
9f80: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
9f90: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
9fa0: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
9fb0: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
9fc0: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
9fd0: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
9fe0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
9ff0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
a000: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a010: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
a020: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
a030: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a040: 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61  t;.  int i = pPa
a050: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30  ger->pageSize-20
a060: 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20  0;.  while( i>0 
a070: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
a080: 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20  aData[i];.    i 
a090: 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65  -= 200;.  }.  re
a0a0: 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f  turn cksum;.}../
a0b0: 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
a0c0: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
a0d0: 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
a0e0: 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52  gHdr*);../*.** R
a0f0: 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67  ead a single pag
a100: 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  e from the journ
a110: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f  al file opened o
a120: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
a130: 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62  r.** jfd.  Playb
a140: 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67  ack this one pag
a150: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43  e..**.** If useC
a160: 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73  ksum==0 it means
a170: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f   this journal do
a180: 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b  es not use check
a190: 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73  sums.  Checksums
a1a0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64  .** are not used
a1b0: 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   in statement jo
a1c0: 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73  urnals because s
a1d0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
a1e0: 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64  s do not.** need
a1f0: 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65   to survive powe
a200: 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73  r failures..*/.s
a210: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a220: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
a230: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
a240: 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e   OsFile *jfd, in
a250: 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69  t useCksum){.  i
a260: 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a  nt rc;.  PgHdr *
a270: 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  pPg;            
a280: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69         /* An exi
a290: 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68  sting page in th
a2a0: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e  e cache */.  Pgn
a2b0: 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  o pgno;         
a2c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a2d0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
a2e0: 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e   a page in journ
a2f0: 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75  al */.  u32 cksu
a300: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
a310: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
a320: 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74  m used for sanit
a330: 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20  y checking */.  
a340: 75 38 20 2a 61 44 61 74 61 20 3d 20 28 75 38 20  u8 *aData = (u8 
a350: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
a360: 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73  ace;   /* Temp s
a370: 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67  torage for a pag
a380: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b  e */..  /* useCk
a390: 73 75 6d 20 73 68 6f 75 6c 64 20 62 65 20 74 72  sum should be tr
a3a0: 75 65 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ue for the main 
a3b0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73  journal and fals
a3c0: 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  e for.  ** state
a3d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20  ment journals.  
a3e0: 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
a3f0: 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 63   is always the c
a400: 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ase.  */.  asser
a410: 74 28 20 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b  t( jfd == (useCk
a420: 73 75 6d 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66  sum ? pPager->jf
a430: 64 20 3a 20 70 50 61 67 65 72 2d 3e 73 74 66 64  d : pPager->stfd
a440: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ) );.  assert( a
a450: 44 61 74 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Data );..  rc = 
a460: 72 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20  read32bits(jfd, 
a470: 26 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63  &pgno);.  if( rc
a480: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
a490: 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
a4a0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66  sqlite3OsRead(jf
a4b0: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
a4c0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  ->pageSize);.  i
a4d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a4e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
a4f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a500: 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
a510: 67 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f  geSize + 4;..  /
a520: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
a530: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
a540: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
a550: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
a560: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
a570: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
a580: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
a590: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
a5a0: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
a5b0: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
a5c0: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
a5d0: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
a5e0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
a5f0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
a600: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
a610: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
a620: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
a630: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
a640: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
a650: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
a660: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
a670: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
a680: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
a690: 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ONE;.  }.  if( p
a6a0: 67 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50  gno>(unsigned)pP
a6b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
a6c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a6d0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
a6e0: 75 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20  useCksum ){.    
a6f0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a700: 6a 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  jfd, &cksum);.  
a710: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a720: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
a730: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a740: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
a750: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
a760: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
a770: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a780: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
a790: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
a7a0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
a7b0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
a7c0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
a7d0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
a7e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
a7f0: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
a800: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
a810: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
a820: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
a830: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
a840: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
a850: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
a860: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
a870: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
a880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
a890: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
a8a0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
a8b0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
a8c0: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
a8d0: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
a8e0: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
a8f0: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
a900: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
a910: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
a920: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
a930: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
a940: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
a950: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
a960: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a970: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
a980: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
a990: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
a9a0: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
a9b0: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
a9c0: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
a9d0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
a9e0: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
a9f0: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
aa00: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
aa10: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
aa20: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
aa30: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
aa40: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
aa50: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
aa60: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
aa70: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
aa80: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
aa90: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
aaa0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
aab0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
aac0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
aad0: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
aae0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
aaf0: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
ab00: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
ab10: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
ab20: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
ab30: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
ab40: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
ab50: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
ab60: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
ab70: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
ab80: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
ab90: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
aba0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
abb0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
abc0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
abd0: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
abe0: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
abf0: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
ac00: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
ac10: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
ac20: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
ac30: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
ac40: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
ac50: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
ac60: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
ac70: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
ac80: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
ac90: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
aca0: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
acb0: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
acc0: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
acd0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
ace0: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
acf0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
ad00: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
ad10: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
ad20: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
ad30: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
ad40: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
ad50: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
ad60: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
ad70: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
ad80: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
ad90: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
ada0: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
adb0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
adc0: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
add0: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
ade0: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
adf0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
ae00: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
ae10: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
ae20: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
ae30: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
ae40: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
ae50: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20  Sync==0..  */.  
ae60: 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
ae70: 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
ae80: 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28  ;.  PAGERTRACE4(
ae90: 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67  "PLAYBACK %d pag
aea0: 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
aeb0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
aec0: 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
aed0: 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f  r), pgno, pager_
aee0: 64 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d  datahash(pPager-
aef0: 3e 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61  >pageSize, aData
af00: 29 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ));.  if( pPager
af10: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
af20: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
af30: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
af40: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
af50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
af60: 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
af70: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
af80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
af90: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
afa0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
afb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
afc0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
afd0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
afe0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
aff0: 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20     if( pPg ){.  
b000: 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50      makeClean(pP
b010: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  g);.    }.  }.  
b020: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
b030: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
b040: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
b050: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
b060: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
b070: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
b080: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
b090: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
b0a0: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
b0b0: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
b0c0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
b0d0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
b0e0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
b0f0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
b100: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
b110: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
b120: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
b130: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
b140: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
b150: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
b160: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
b170: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
b180: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
b190: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
b1a0: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
b1b0: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
b1c0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
b1d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
b1e0: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
b1f0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
b200: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
b210: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
b220: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
b230: 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
b240: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
b250: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
b260: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
b270: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
b280: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
b290: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a  );.#endif.    /*
b2a0: 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67   If this was pag
b2b0: 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72  e 1, then restor
b2c0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  e the value of P
b2d0: 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e  ager.dbFileVers.
b2e0: 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20  .    ** Do this 
b2f0: 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64  before any decod
b300: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ing. */.    if( 
b310: 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
b320: 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
b330: 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28  >dbFileVers, &((
b340: 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73  u8*)pData)[24],s
b350: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
b360: 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
b370: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  }..    /* Decode
b380: 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72   the page just r
b390: 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f  ead from disk */
b3a0: 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67  .    CODEC1(pPag
b3b0: 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
b3c0: 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20  pgno, 3);.  }.  
b3d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b3e0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d  .** Parameter zM
b3f0: 61 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d  aster is the nam
b400: 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
b410: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69  urnal file. A si
b420: 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ngle journal.** 
b430: 66 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72  file that referr
b440: 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72  ed to the master
b450: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
b460: 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c  s just been roll
b470: 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73  ed back..** This
b480: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b490: 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  if it is possibl
b4a0: 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  e to delete the 
b4b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b4c0: 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73  ile,.** and does
b4d0: 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a   so if it is..**
b4e0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
b4f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74  ournal file cont
b500: 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f  ains the names o
b510: 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72  f all child jour
b520: 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c  nals..** To tell
b530: 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   if a master jou
b540: 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65  rnal can be dele
b550: 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61  ted, check to ea
b560: 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69  ch of the.** chi
b570: 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63  ldren.  If all c
b580: 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68  hildren are eith
b590: 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f  er missing or do
b5a0: 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a   not refer to.**
b5b0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73   a different mas
b5c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65  ter journal, the
b5d0: 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f  n this master jo
b5e0: 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c  urnal can be del
b5f0: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
b600: 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  int pager_delmas
b610: 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ter(const char *
b620: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
b630: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
b640: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46  _open = 0;.  OsF
b650: 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b  ile *master = 0;
b660: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
b670: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
b680: 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
b690: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
b6a0: 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
b6b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
b6c0: 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
b6d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
b6e0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
b6f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
b700: 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20  ile exclusively 
b710: 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68  in case some oth
b720: 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20  er process.  ** 
b730: 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20  is running this 
b740: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f  routine also. No
b750: 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20  t that it makes 
b760: 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65  too much differe
b770: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nce..  */.  rc =
b780: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
b790: 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20  adOnly(zMaster, 
b7a0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  &master);.  asse
b7b0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
b7c0: 4b 20 7c 7c 20 6d 61 73 74 65 72 20 29 3b 0a 20  K || master );. 
b7d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b7e0: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
b7f0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
b800: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63  r_open = 1;.  rc
b810: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b820: 53 69 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d  Size(master, &nM
b830: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
b840: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b850: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
b860: 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20  ter_out;..  if( 
b870: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30  nMasterJournal>0
b880: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a   ){.    char *zJ
b890: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72  ournal;.    char
b8a0: 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30   *zMasterPtr = 0
b8b0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
b8c0: 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72  he entire master
b8d0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
b8e0: 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
b8f0: 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71  d from.    ** sq
b900: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
b910: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
b920: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
b930: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
b940: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
b950: 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  r *)sqliteMalloc
b960: 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (nMasterJournal)
b970: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
b980: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
b990: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
b9a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
b9b0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
b9c0: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
b9d0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73  qlite3OsRead(mas
b9e0: 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
b9f0: 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72  nal, nMasterJour
ba00: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nal);.    if( rc
ba10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
ba20: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ba30: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
ba40: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
ba50: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
ba60: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
ba70: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
ba80: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
ba90: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
baa0: 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29  Exists(zJournal)
bab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
bac0: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
bad0: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
bae0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
baf0: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
bb00: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
bb10: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
bb20: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
bb30: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
bb40: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
bb50: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
bb60: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
bb70: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
bb80: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
bb90: 20 20 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e     OsFile *journ
bba0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  al = 0;.        
bbb0: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
bbc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
bbd0: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72  enReadOnly(zJour
bbe0: 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a  nal, &journal);.
bbf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
bc00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
bc10: 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20   journal );.    
bc20: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bc30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
bc40: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
bc50: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
bc60: 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
bc70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
bc80: 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74  (journal, &zMast
bc90: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
bca0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
bcb0: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
bcc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bcd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
bce0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
bcf0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
bd00: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
bd10: 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72  terPtr!=0 && str
bd20: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
bd30: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
bd40: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
bd50: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
bd60: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
bd70: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
bd80: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
bd90: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
bda0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
bdb0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
bdc0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
bdd0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
bde0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
bdf0: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
be00: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
be10: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20    }.  }.  .  rc 
be20: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
be30: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c  e(zMaster);..del
be40: 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
be50: 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
be60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
be70: 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ee(zMasterJourna
be80: 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20  l);.  }  .  if( 
be90: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20  master_open ){. 
bea0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
beb0: 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(&master);.  }.
bec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
bed0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
bee0: 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
bef0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
bf00: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  ;../*.** Truncat
bf10: 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20  e the main file 
bf20: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  of the given pag
bf30: 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  er to the number
bf40: 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64   of pages.** ind
bf50: 69 63 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75  icated. Also tru
bf60: 6e 63 61 74 65 20 74 68 65 20 63 61 63 68 65 64  ncate the cached
bf70: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bf80: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  of the file..*/.
bf90: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
bfa0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
bfb0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
bfc0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
bfd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
bfe0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
bff0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
c000: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c010: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
c020: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
c030: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
c040: 6e 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  nPage);.  }.  if
c050: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c060: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
c070: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
c080: 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
c090: 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
c0a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c0b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
c0c0: 68 65 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f  he sectorSize fo
c0d0: 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
c0e0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  r..**.** The sec
c0f0: 74 6f 72 20 73 69 7a 65 20 69 73 20 74 68 65 20  tor size is the 
c100: 6c 61 72 67 65 72 20 6f 66 20 74 68 65 20 73 65  larger of the se
c110: 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f 72 74  ctor size report
c120: 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 33  ed.** by sqlite3
c130: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 61  OsSectorSize() a
c140: 6e 64 20 74 68 65 20 70 61 67 65 53 69 7a 65 2e  nd the pageSize.
c150: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c160: 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50 61  setSectorSize(Pa
c170: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
c180: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
c190: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
c1a0: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
c1b0: 3e 66 64 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >fd);.  if( pPag
c1c0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70  er->sectorSize<p
c1d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
c1e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
c1f0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 70 50 61 67  ectorSize = pPag
c200: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
c210: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  }.}../*.** Playb
c220: 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ack the journal 
c230: 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72 65  and thus restore
c240: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c250: 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61  le to.** the sta
c260: 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65 66  te it was in bef
c270: 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20 6d  ore we started m
c280: 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20 20  aking changes.  
c290: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
c2a0: 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 69  al file format i
c2b0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a  s as follows: .*
c2c0: 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79 74  *.**  (1)  8 byt
c2d0: 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f 70  e prefix.  A cop
c2e0: 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  y of aJournalMag
c2f0: 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34  ic[]..**  (2)  4
c300: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
c310: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
c320: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
c330: 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72  valid page recor
c340: 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20 74  ds.**       in t
c350: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20  he journal.  If 
c360: 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30 78  this value is 0x
c370: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 63  ffffffff, then c
c380: 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20 20  ompute the.**   
c390: 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70 61      number of pa
c3a0: 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d 20  ge records from 
c3b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65  the journal size
c3c0: 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79 74  ..**  (3)  4 byt
c3d0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
c3e0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c3f0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c400: 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20 20  for the .**     
c410: 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73 75    sanity checksu
c420: 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62 79  m..**  (4)  4 by
c430: 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
c440: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
c450: 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e 63  f pages to trunc
c460: 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ate the.**      
c470: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75 72   database to dur
c480: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ing a rollback..
c490: 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65 20  **  (5)  4 byte 
c4a0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c4b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
c4c0: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
c4d0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  er journal.**   
c4e0: 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20 76      name.  The v
c4f0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
c500: 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74 20   (indicate that 
c510: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
c520: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
c530: 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e  nal.).**  (6)  N
c540: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d 61   bytes of the ma
c550: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
c560: 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69 6c  e.  The name wil
c570: 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  l be nul-termina
c580: 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ted.**       and
c590: 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74 65   might be shorte
c5a0: 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
c5b0: 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e 20   read from (5). 
c5c0: 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62 79   If the first by
c5d0: 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74  te.**       of t
c5e0: 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30 20  he name is \000 
c5f0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
c600: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
c610: 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20    The master.** 
c620: 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61        journal na
c630: 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  me is stored in 
c640: 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20  UTF-8..**  (7)  
c650: 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67  Zero or more pag
c660: 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65 61  es instances, ea
c670: 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ch as follows:.*
c680: 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
c690: 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  te page number..
c6a0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50 61  **        +  pPa
c6b0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
c6c0: 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20  tes of data..** 
c6d0: 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65         +  4 byte
c6e0: 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20   checksum.**.** 
c6f0: 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f 66  When we speak of
c700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
c710: 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68 65  der, we mean the
c720: 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20 61   first 6 items a
c730: 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e  bove..** Each en
c740: 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  try in the journ
c750: 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63  al is an instanc
c760: 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74 65  e of the 7th ite
c770: 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  m..**.** Call th
c780: 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  e value from the
c790: 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22   second bullet "
c7a0: 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73 20  nRec".  nRec is 
c7b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
c7c0: 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74 72   valid page entr
c7d0: 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ies in the journ
c7e0: 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61 73  al.  In most cas
c7f0: 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70  es, you can comp
c800: 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65  ute the.** value
c810: 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74 68   of nRec from th
c820: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c830: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75 74  urnal file.  But
c840: 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66   if a power.** f
c850: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 20  ailure occurred 
c860: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
c870: 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69 74  l was being writ
c880: 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62 65  ten, it could be
c890: 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68 61   the.** case tha
c8a0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
c8b0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
c8c0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
c8d0: 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a 2a  increased but.**
c8e0: 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72 69   the extra entri
c8f0: 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 6d  es had not yet m
c900: 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74 6f  ade it safely to
c910: 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68 20   disk.  In such 
c920: 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76  a case,.** the v
c930: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d  alue of nRec com
c940: 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66  puted from the f
c950: 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20 62  ile size would b
c960: 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f  e too large.  Fo
c970: 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f 6e  r.** that reason
c980: 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
c990: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
c9a0: 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a  n the header..**
c9b0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63 20  .** If the nRec 
c9c0: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
c9d0: 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68 61  fff it means tha
c9e0: 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62 65  t nRec should be
c9f0: 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f   computed.** fro
ca00: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2e  m the file size.
ca10: 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73 20    This value is 
ca20: 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75 73  used when the us
ca30: 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a 2a  er selects the.*
ca40: 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e  * no-sync option
ca50: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
ca60: 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c 75  .  A power failu
ca70: 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  re could lead to
ca80: 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69   corruption.** i
ca90: 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42 75  n this case.  Bu
caa0: 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b  t for things lik
cab0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
cac0: 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  e (which will be
cad0: 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e  .** deleted when
cae0: 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72 65   the power is re
caf0: 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27 74  stored) we don't
cb00: 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49   care.  .**.** I
cb10: 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  f the file opene
cb20: 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d as the journal
cb30: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 77   file is not a w
cb40: 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f  ell-formed.** jo
cb50: 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
cb60: 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f 20  all pages up to 
cb70: 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75 70  the first corrup
cb80: 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f 6c  ted page are rol
cb90: 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20  led.** back (or 
cba0: 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65 20  no pages if the 
cbb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
cbc0: 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54 68  s corrupted). Th
cbd0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
cbe0: 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74 65  * is then delete
cbf0: 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
cc00: 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20 61  returned, just a
cc10: 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74 69  s if no corrupti
cc20: 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65  on had.** been e
cc30: 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a  ncountered..**.*
cc40: 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d  * If an I/O or m
cc50: 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
cc60: 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61  curs, the journa
cc70: 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64 65  l-file is not de
cc80: 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20  leted.** and an 
cc90: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
cca0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
ccb0: 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79  c int pager_play
ccc0: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
ccd0: 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a  er, int isHot){.
cce0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
cd00: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
cd10: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
cd20: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd40: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
cd50: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
cd60: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
cd90: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
cda0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
cdb0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
cdc0: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
cdd0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
ce00: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
ce10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
ce20: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
ce30: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
ce40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
ce50: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
ce60: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
ce70: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
ce80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
ce90: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
cea0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
ceb0: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
cec0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ced0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
cee0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
cef0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
cf00: 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
cf10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cf20: 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
cf30: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
cf40: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
cf50: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
cf60: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
cf70: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
cf80: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
cf90: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
cfa0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
cfb0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
cfc0: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
cfd0: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
cfe0: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
cff0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
d000: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
d010: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
d020: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
d030: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
d040: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
d050: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73  ager->jfd, &zMas
d060: 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ter);.  assert( 
d070: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d080: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d090: 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74  ITE_OK || (zMast
d0a0: 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73  er && !sqlite3Os
d0b0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74  FileExists(zMast
d0c0: 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  er)) ){.    sqli
d0d0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
d0e0: 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
d0f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
d100: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d  LITE_DONE ) rc =
d110: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d120: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
d130: 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  k;.  }.  sqlite3
d140: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d150: 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72  fd, 0);.  pPager
d160: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
d170: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
d180: 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74  p terminates eit
d190: 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61  her when the rea
d1a0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61  dJournalHdr() ca
d1b0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20  ll returns.  ** 
d1c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
d1d0: 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
d1e0: 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31  s. */.  while( 1
d1f0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   ){..    /* Read
d200: 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61   the next journa
d210: 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68  l header from th
d220: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
d230: 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20   If there are.  
d240: 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20    ** not enough 
d250: 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68  bytes left in th
d260: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
d270: 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65  or a complete he
d280: 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  ader, or.    ** 
d290: 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c  it is corrupted,
d2a0: 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   then a process 
d2b0: 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77  must of failed w
d2c0: 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e  hile writing it.
d2d0: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64  .    ** This ind
d2e0: 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d  icates nothing m
d2f0: 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ore needs to be 
d300: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20  rolled back..   
d310: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61   */.    rc = rea
d320: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  dJournalHdr(pPag
d330: 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20  er, szJ, &nRec, 
d340: 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20  &mxPg);.    if( 
d350: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d360: 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d   .      if( rc==
d370: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
d380: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
d390: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
d3a0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
d3b0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20  ayback;.    }.. 
d3c0: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
d3d0: 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65   0xffffffff, the
d3e0: 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  n this journal w
d3f0: 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
d400: 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77  process.    ** w
d410: 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e  orking in no-syn
d420: 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61  c mode. This mea
d430: 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74  ns that the rest
d440: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   of the journal.
d450: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73      ** file cons
d460: 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74  ists of pages, t
d470: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
d480: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73   journal headers
d490: 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a  . Compute.    **
d4a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
d4b0: 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ec based on this
d4c0: 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20   assumption..   
d4d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
d4e0: 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a  ==0xffffffff ){.
d4f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
d500: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d510: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
d520: 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
d530: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
d540: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
d550: 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f  Pager))/JOURNAL_
d560: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  PG_SZ(pPager);. 
d570: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
d580: 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74 68  nRec is 0 and th
d590: 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f  is rollback is o
d5a0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
d5b0: 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73 0a  created by this.
d5c0: 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
d5d0: 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74 68  nd if this is th
d5e0: 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20 69  e final header i
d5f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  n the journal, t
d600: 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20 20  hen it means.   
d610: 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70 61   ** that this pa
d620: 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
d630: 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c 6c  l was being fill
d640: 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79  ed but has not y
d650: 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 73  et been.    ** s
d660: 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 20  ynced to disk.  
d670: 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d 62  Compute the numb
d680: 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73 65  er of pages base
d690: 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e 69  d on the remaini
d6a0: 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20 6f  ng.    ** size o
d6b0: 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20  f the file..    
d6c0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 68  **.    ** The th
d6d0: 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ird term of the 
d6e0: 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20 74  test was added t
d6f0: 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32 35  o fix ticket #25
d700: 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  65..    */.    i
d710: 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21 69  f( nRec==0 && !i
d720: 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20 20  sHot &&.        
d730: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
d740: 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  dr+JOURNAL_HDR_S
d750: 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67 65  Z(pPager)==pPage
d760: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 7b  r->journalOff ){
d770: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
d780: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
d790: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
d7a0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
d7b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d7c0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
d7d0: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
d7e0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
d7f0: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
d800: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
d810: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
d820: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
d830: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d840: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d850: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
d860: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
d870: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
d880: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
d890: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
d8a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d8b0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
d8c0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
d8d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d8e0: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
d8f0: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
d900: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
d910: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
d920: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
d930: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
d940: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
d950: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
d960: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
d970: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
d980: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  jfd, 1);.      i
d990: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d9b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
d9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
d9d0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
d9e0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
d9f0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
da00: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
da10: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
da20: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
da30: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
da40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
da50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
da60: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
da70: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
da80: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
da90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
daa0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
dab0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
dac0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
dad0: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
dae0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
daf0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
db00: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
db10: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
db20: 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
db30: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
db40: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
db50: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
db60: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
db70: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
db80: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
db90: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
dba0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
dbb0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
dbc0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
dbd0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
dbe0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
dbf0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
dc00: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
dc10: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
dc20: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
dc30: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
dc40: 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
dc50: 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
dc60: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
dc70: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
dc80: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
dc90: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
dca0: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
dcb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
dcc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
dcd0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
dce0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
dcf0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
dd00: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
dd10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
dd20: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
dd30: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
dd40: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
dd50: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
dd60: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
dd70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
dd80: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
dd90: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
dda0: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
ddb0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
ddc0: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
ddd0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
dde0: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
ddf0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
de00: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
de10: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
de20: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
de30: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
de40: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
de50: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
de60: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
de70: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
de80: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
de90: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
dea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
deb0: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
dec0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
ded0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
dee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
def0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
df00: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
df10: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
df20: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
df30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
df40: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
df50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
df60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
df70: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
df80: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
df90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dfa0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
dfb0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
dfc0: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
dfd0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
dfe0: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
dff0: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
e000: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e010: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
e020: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
e030: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
e040: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
e050: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
e060: 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
e070: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
e080: 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
e090: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
e0a0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
e0b0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
e0c0: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
e0d0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
e0e0: 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
e0f0: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e100: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
e110: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
e120: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
e130: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
e140: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
e150: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e160: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
e170: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
e180: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
e190: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
e1a0: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
e1b0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
e1c0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
e1d0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
e1e0: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
e1f0: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
e200: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
e210: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e220: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
e230: 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
e240: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
e250: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
e260: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
e270: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
e280: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
e290: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
e2a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e2b0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
e2c0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
e2d0: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
e2e0: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
e2f0: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
e300: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
e310: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
e320: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
e330: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
e340: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e350: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
e360: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
e370: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
e380: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
e390: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
e3a0: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
e3b0: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
e3c0: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
e3d0: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
e3e0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
e3f0: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
e400: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
e410: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
e420: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
e430: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
e440: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e450: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e460: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e470: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
e480: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
e490: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
e4a0: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
e4b0: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
e4c0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
e4d0: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
e4e0: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
e4f0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
e500: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
e510: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
e520: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
e530: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
e540: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
e550: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
e560: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
e570: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
e580: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
e590: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
e5a0: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
e5b0: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
e5c0: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
e5d0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e5e0: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
e5f0: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
e600: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
e610: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
e620: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
e630: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
e640: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
e650: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
e660: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
e670: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
e680: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
e690: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
e6a0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
e6b0: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
e6c0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
e6d0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
e6e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
e6f0: 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61  um;.  while( pPa
e700: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e710: 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  < hdrOff ){.    
e720: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
e730: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
e740: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
e750: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
e760: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
e770: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
e780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e790: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
e7a0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
e7b0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
e7c0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
e7d0: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
e7e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e7f0: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
e800: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
e810: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
e820: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
e830: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
e840: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
e850: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e860: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
e870: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
e880: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
e890: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
e8a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
e8b0: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
e8c0: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
e8d0: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
e8e0: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
e8f0: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
e900: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
e910: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
e920: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e930: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
e940: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
e950: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
e960: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
e970: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
e980: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
e990: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
e9a0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e9b0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e9c0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e9d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
e9e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
e9f0: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
ea00: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
ea10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
ea20: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
ea30: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
ea40: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
ea50: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
ea60: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ea80: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
ea90: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
eaa0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
eab0: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
eac0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
ead0: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
eae0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
eaf0: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
eb00: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
eb10: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
eb20: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
eb30: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
eb40: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
eb50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
eb60: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
eb70: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
eb80: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
eb90: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
eba0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
ebb0: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
ebc0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
ebd0: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
ebe0: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
ebf0: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
ec00: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
ec10: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
ec20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
ec30: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
ec40: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
ec50: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
ec70: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
ec80: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
ec90: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
eca0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
ecb0: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
ecc0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
ecd0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
ece0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
ecf0: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
ed00: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
ed10: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
ed30: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
ed40: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
ed50: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
ed60: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
ed70: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
ed80: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
ed90: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
eda0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
edb0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
edc0: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
edd0: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
ede0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
edf0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
ee00: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
ee10: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
ee20: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
ee30: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
ee40: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
ee50: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
ee60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ee70: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
ee80: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
ee90: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
eea0: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
eec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
eed0: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
eee0: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
eef0: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
ef00: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
ef10: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
ef20: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
ef30: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
ef40: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
ef50: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
ef60: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
ef70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
ef80: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
ef90: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
efa0: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
efb0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
efc0: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
efd0: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
efe0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
eff0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
f000: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
f010: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
f020: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
f030: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
f040: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
f050: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
f060: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f070: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
f080: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
f090: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
f0a0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
f0b0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
f0c0: 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  _fsync){.  pPage
f0d0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
f0e0: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
f0f0: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
f100: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
f110: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
f120: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
f130: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
f140: 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63  ync = full_fsync
f150: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
f160: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
f170: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
f180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
f190: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
f1a0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
f1b0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
f1c0: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
f1d0: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
f1e0: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
f1f0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
f200: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
f210: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
f220: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
f230: 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
f240: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
f250: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
f260: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
f270: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
f280: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
f290: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
f2a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f2b0: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
f2c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
f2d0: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
f2e0: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
f2f0: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
f300: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
f310: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
f320: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
f330: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
f340: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
f350: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
f360: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
f370: 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29  mp(OsFile **pFd)
f380: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b  {.  int cnt = 8;
f390: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
f3a0: 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54  r zFile[SQLITE_T
f3b0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
f3c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
f3d0: 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
f3e0: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
f3f0: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
f400: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
f410: 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
f420: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
f430: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
f440: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
f450: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
f460: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
f470: 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31  ve(zFile, pFd, 1
f480: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
f490: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
f4a0: 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c 65  *pFd );.  }while
f4b0: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
f4c0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
f4d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
f4e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f4f0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f500: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
f510: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
f520: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
f530: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
f540: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
f550: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
f560: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
f570: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
f580: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
f590: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
f5a0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
f5b0: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
f5c0: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
f5d0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
f5e0: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
f5f0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
f600: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
f610: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
f620: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
f630: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
f640: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
f650: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
f660: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
f670: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
f680: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
f690: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
f6a0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
f6b0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
f6c0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
f6d0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
f6e0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
f6f0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
f700: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
f710: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
f720: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
f730: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
f740: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
f750: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
f760: 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65  agerOpen(.  Page
f770: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
f780: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
f790: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f7a0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
f7b0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
f7c0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
f7d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f7e0: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
f7f0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
f800: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
f810: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
f820: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
f830: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
f840: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
f850: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
f860: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
f870: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
f880: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
f890: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
f8a0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
f8b0: 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70  ameLen;  /* Comp
f8c0: 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54  iler is wrong. T
f8d0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e  his is always in
f8e0: 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
f8f0: 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65   use */.  OsFile
f900: 20 2a 66 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20   *fd = 0;.  int 
f910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f920: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
f930: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
f940: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
f950: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
f960: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
f970: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
f980: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
f990: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
f9a0: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
f9b0: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
f9c0: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
f9d0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
f9e0: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66  PNAME_SIZE];.#if
f9f0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
fa00: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
fa10: 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
fa20: 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
fa30: 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
fa40: 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
fa50: 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
fa60: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
fa70: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
fa80: 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
fa90: 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
faa0: 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
fab0: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
fac0: 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
fad0: 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
fae0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
faf0: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
fb00: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
fb10: 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
fb20: 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69  . It would be ni
fb30: 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a  ce to assert.  *
fb40: 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  * that ThreadDat
fb50: 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d  a.nAlloc is non-
fb60: 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74  zero, but alas t
fb70: 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20  his breaks test 
fb80: 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74  cases .  ** writ
fb90: 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ten to invoke th
fba0: 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79  e pager directly
fbb0: 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
fbc0: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
fbd0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
fbe0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
fbf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
fc00: 57 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  We used to test 
fc10: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20  if malloc() had 
fc20: 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 62  already failed b
fc30: 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67  efore proceeding
fc40: 2e 20 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  . .  ** But the 
fc50: 77 61 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f  way this functio
fc60: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 53 51 4c  n is used in SQL
fc70: 69 74 65 20 6d 65 61 6e 73 20 74 68 61 74 20 63  ite means that c
fc80: 61 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61  an never.  ** ha
fc90: 70 70 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72  ppen. Furthermor
fca0: 65 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63  e, if the malloc
fcb0: 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 69 73 20  -failed flag is 
fcc0: 61 6c 72 65 61 64 79 20 73 65 74 2c 20 0a 20 20  already set, .  
fcd0: 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 61  ** either the ca
fce0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 53 74 72 44  ll to sqliteStrD
fcf0: 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65 4d 61  up() or sqliteMa
fd00: 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77 69 6c  lloc() below wil
fd10: 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72  l.  ** fail shor
fd20: 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  tly and SQLITE_N
fd30: 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20 61 6e  OMEM returned an
fd40: 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  yway..  */.  *pp
fd50: 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
fd60: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
fd70: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
fd80: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
fd90: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
fda0: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
fdb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
fdc0: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
fdd0: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
fde0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
fdf0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
fe00: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
fe10: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
fe20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
fe30: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
fe40: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
fe50: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
fe60: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
fe70: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
fe80: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
fe90: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
fea0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
feb0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
fec0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
fed0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
fee0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
fef0: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
ff00: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
ff10: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
ff20: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
ff30: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
ff40: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20 20 61  Only);.        a
ff50: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ff60: 45 5f 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a 20 20  E_OK || fd );.  
ff70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
ff80: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
ff90: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
ffa0: 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  mp(&fd);.    sql
ffb0: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
ffc0: 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a  me(zTemp);.    z
ffd0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
ffe0: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
fff0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
10000 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
10010 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
10020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10030 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
10040 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
10050 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
10060 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
10070 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
10080 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
10090 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
100a0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
100b0 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
100c0 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
100d0 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
100e0 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
100f0 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
10100 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
10110 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
10120 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
10130 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
10140 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
10150 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
10160 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
10170 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
10180 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
10190 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69  *3 + 30 );.    i
101a0 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
101b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
101c0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
101d0 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
101e0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
101f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
10200 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
10210 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61  .  }...  /* If a
10220 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
10230 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
10240 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
10250 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
10260 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
10270 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
10280 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
10290 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
102a0 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
102b0 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
102c0 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
102d0 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
102e0 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
102f0 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
10300 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
10310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
10320 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
10330 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72  hname || !pPager
10340 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72  ->pTmpSpace || r
10350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10360 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
10370 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
10380 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
10390 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  hname);.    sqli
103a0 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
103b0 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
103c0 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
103d0 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
103e0 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
103f0 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
10400 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
10410 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
10420 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
10430 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
10440 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
10450 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
10460 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
10470 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
10480 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
10490 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
104a0 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
104b0 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
104c0 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
104d0 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
104e0 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 63  meLen+1];.  memc
104f0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
10500 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
10510 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b  ame, nameLen+1);
10520 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
10530 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
10540 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d  ullPathname, nam
10550 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f 72 28  eLen+1);..  for(
10560 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
10570 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
10580 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
10590 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
105a0 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
105b0 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
105c0 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
105d0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
105e0 50 61 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c 65 6e  Pathname,nameLen
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
10600 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10610 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
10620 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
10630 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  en], "-journal",
10640 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
10650 22 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  "));.  pPager->f
10660 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
10670 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
10680 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
10690 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
106a0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
106b0 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
106c0 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
106d0 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
106e0 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
106f0 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
10700 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
10710 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
10720 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
10730 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
10740 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
10750 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
10760 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
10770 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
10780 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
10790 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
107a0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
107b0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
107c0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
107d0 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
107e0 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
107f0 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
10800 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
10810 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
10820 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10830 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20  _UNLOCK==0 );.  
10840 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
10850 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
10860 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
10870 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
10880 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
10890 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
108a0 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
108b0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
108c0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
108d0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
108e0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
108f0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
10900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
10910 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
10920 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
10930 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
10940 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
10950 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
10960 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
10970 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
10980 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
10990 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
109a0 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
109b0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
109c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
109d0 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
109e0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
109f0 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
10a00 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70  ync?0:1);.  /* p
10a10 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
10a20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
10a30 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
10a40 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
10a50 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
10a60 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
10a70 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
10a80 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
10a90 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44   assert(fd||memD
10aa0 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  b);.  if( !memDb
10ab0 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
10ac0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
10ad0 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
10ae0 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
10af0 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
10b00 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
10b10 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
10b20 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
10b30 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
10b40 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
10b50 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
10b60 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
10b70 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
10b80 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
10b90 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
10ba0 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
10bb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10bc0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
10bd0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
10be0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
10bf0 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
10c00 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
10c10 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
10c20 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
10c30 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
10c40 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
10c50 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
10c60 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
10c70 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
10c80 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
10c90 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
10ca0 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
10cb0 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
10cc0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
10cd0 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
10ce0 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
10cf0 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
10d00 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
10d10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
10d20 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
10d30 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
10d40 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
10d50 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
10d60 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
10d70 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
10d80 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
10d90 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
10da0 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
10db0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
10dc0 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
10dd0 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
10de0 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
10df0 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
10e00 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
10e10 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
10e20 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
10e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
10e40 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
10e50 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
10e60 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
10e70 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
10e80 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
10e90 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
10ea0 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
10eb0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
10ec0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
10ed0 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
10ee0 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
10ef0 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
10f00 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
10f10 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
10f20 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
10f30 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
10f40 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
10f50 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
10f60 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
10f70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
10f80 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
10f90 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
10fa0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
10fb0 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
10fc0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
10fd0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
10fe0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
10ff0 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e  ge size.  Return
11000 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20   the new size.  
11010 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
11020 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  ew page.** size 
11030 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  is inappropriate
11040 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
11050 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
11060 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  is selected.** a
11070 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  nd returned..*/.
11080 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11090 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
110a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70  r *pPager, int p
110b0 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65  ageSize){.  asse
110c0 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  rt( pageSize>=51
110d0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
110e0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
110f0 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50  IZE );.  if( !pP
11100 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
11110 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
11120 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
11130 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
11140 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
11150 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
11160 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
11170 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  e = sqlite3Reall
11180 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d  ocOrFree(pPager-
11190 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65  >pTmpSpace, page
111a0 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
111b0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
111c0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Size;.}../*.** A
111d0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
111e0 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
111f0 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
11200 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
11210 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
11220 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
11230 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
11240 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
11250 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
11260 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
11270 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
11280 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
11290 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
112a0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
112b0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
112c0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
112d0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
112e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
112f0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
11300 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
11310 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
11320 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
11330 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
11340 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
11350 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
11360 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
11370 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
11380 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
11390 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
113a0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
113b0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
113c0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
113d0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
113e0 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
113f0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
11400 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
11410 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
11420 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
11430 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
11440 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
11450 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
11460 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
11470 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
11480 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
11490 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
114a0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
114b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
114c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
114d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
114e0 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
114f0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11500 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
11510 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
11520 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
11530 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
11540 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
11550 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
11560 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
11570 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
11580 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
11590 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
115a0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
115b0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
115c0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
115d0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
115e0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
115f0 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
11600 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
11610 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
11620 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11630 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11640 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
11650 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
11660 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11670 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
11680 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
11690 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
116a0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
116b0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
116c0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
116d0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
116e0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
116f0 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
11700 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
11710 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
11720 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
11730 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
11740 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
11750 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
11760 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
11770 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
11780 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
11790 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
117a0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
117b0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
117c0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
117d0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
117e0 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
117f0 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
11800 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
11810 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
11820 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
11830 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
11840 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
11850 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
11860 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11870 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
11880 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
11890 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
118a0 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
118b0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
118c0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
118d0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
118e0 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
118f0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
11900 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
11910 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
11920 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
11930 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
11940 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
11950 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
11960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11970 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
11980 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
11990 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
119a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
119b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
119c0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
119d0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
119e0 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
119f0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
11a00 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
11a10 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
11a20 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
11a30 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
11a40 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
11a50 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
11a60 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
11a70 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
11a80 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
11a90 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
11aa0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
11ab0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
11ac0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
11ad0 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
11ae0 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
11af0 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
11b00 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
11b10 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
11b20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11b30 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
11b40 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
11b50 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
11b60 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
11b70 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
11b80 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
11b90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
11ba0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
11bb0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
11bc0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
11bd0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
11be0 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
11bf0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
11c00 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
11c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11c20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
11c30 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
11c40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
11c50 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
11c60 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
11c70 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
11c80 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
11c90 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
11ca0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
11cb0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
11cc0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
11cd0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
11ce0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11cf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
11d00 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
11d10 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
11d20 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
11d30 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
11d40 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
11d50 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11d60 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
11d70 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
11d80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
11d90 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
11da0 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
11db0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
11dc0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
11dd0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
11de0 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
11df0 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
11e00 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
11e10 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
11e20 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
11e30 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
11e40 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
11e50 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
11e60 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
11e70 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
11e80 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
11e90 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
11ea0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
11eb0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
11ec0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
11ed0 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
11ee0 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
11ef0 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
11f00 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
11f10 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
11f20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
11f30 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
11f40 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
11f50 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
11f60 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
11f70 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
11f80 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
11f90 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
11fa0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
11fb0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
11fc0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11fd0 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
11fe0 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
11ff0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
12000 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
12010 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
12020 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
12030 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
12040 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
12050 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
12060 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
12070 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
12080 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
12090 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
120a0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
120b0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
120c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
120d0 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
120e0 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
120f0 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
12100 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
12110 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
12120 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
12130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
12140 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
12150 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
12160 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
12170 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
12180 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
12190 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
121a0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
121b0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
121c0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
121d0 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
121e0 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
121f0 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
12200 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
12210 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
12220 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
12230 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
12240 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
12250 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
12260 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
12270 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
12280 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
12290 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
122a0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
122b0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
122c0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
122d0 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
122e0 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
122f0 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
12300 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
12310 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
12320 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12330 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
12340 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
12350 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
12360 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
12370 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
12380 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
12390 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
123a0 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
123b0 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
123c0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
123d0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
123e0 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
123f0 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
12400 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
12410 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
12420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12430 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
12440 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
12450 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12460 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
12470 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
12480 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
12490 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
124a0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
124b0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
124c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
124d0 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
124e0 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
124f0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
12500 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
12510 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
12520 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
12530 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
12540 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
12550 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
12560 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
12570 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
12580 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
12590 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
125a0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61  the cache when a
125b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
125c0 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70  truncated.  Drop
125d0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
125e0 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
125f0 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65  pgno is.** large
12600 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
12610 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
12620 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  eferenced..**.**
12630 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
12640 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
12650 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
12660 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41   zeroed..**.** A
12670 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20  ctually, at the 
12680 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
12690 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
126a0 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20   would be.** an 
126b0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20  error to have a 
126c0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e  referenced page.
126d0 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61    But rather tha
126e0 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74  n delete.** that
126f0 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e   page and guaran
12700 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74  tee a subsequent
12710 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65   segfault, it se
12720 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f  ems better.** to
12730 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70   zero it and hop
12740 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20  e that we error 
12750 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73  out sanely..*/.s
12760 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
12770 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
12780 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12790 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
127a0 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
127b0 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
127c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
127d0 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
127e0 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
127f0 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
12800 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
12810 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
12820 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
12830 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
12840 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
12850 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
12860 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
12870 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
12880 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12890 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
128a0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
128b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
128c0 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
128d0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52  tAll;.      IOTR
128e0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
128f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
12900 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
12910 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
12920 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
12930 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
12940 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
12950 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
12960 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
12970 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
12980 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
12990 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
129a0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
129b0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
129c0 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
129d0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
129e0 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
129f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
12a00 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
12a10 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
12a20 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
12a30 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
12a40 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
12a50 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
12a60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
12a70 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
12a80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
12a90 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
12aa0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
12ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
12ac0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12ad0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
12ae0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
12af0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
12b00 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
12b10 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
12b20 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
12b30 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
12b40 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
12b50 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
12b60 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
12b70 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
12b80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
12b90 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
12ba0 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
12bb0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
12bc0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
12bd0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
12be0 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
12bf0 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
12c00 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
12c10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12c20 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
12c30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
12c40 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
12c50 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
12c60 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
12c70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12c80 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
12c90 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
12ca0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
12cb0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
12cc0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
12cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
12ce0 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
12cf0 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
12d00 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
12d10 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
12d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12d40 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
12d50 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
12d60 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
12d70 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
12d80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12d90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
12da0 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
12db0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
12dc0 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
12dd0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12de0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
12df0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12e00 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
12e10 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
12e20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
12e30 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
12e40 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
12e50 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12e60 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
12e70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
12e80 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
12e90 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
12ea0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
12eb0 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
12ec0 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
12ed0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
12ee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12ef0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
12f00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
12f10 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
12f20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
12f30 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
12f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12f50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
12f60 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
12f70 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
12f80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12f90 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
12fa0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
12fb0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
12fc0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
12fd0 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
12fe0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
12ff0 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
13000 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
13010 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
13020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
13030 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
13040 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
13050 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
13060 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
13070 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
13080 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
13090 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
130a0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
130b0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
130c0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
130d0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
130e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
130f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
13100 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
13110 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
13120 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
13130 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
13140 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
13150 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
13160 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
13170 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
13180 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
13190 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
131a0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
131b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
131c0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
131d0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
131e0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
131f0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
13200 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
13210 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
13220 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
13230 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
13240 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
13250 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
13260 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
13270 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
13280 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
13290 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
132a0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
132b0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
132c0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
132d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
132e0 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
132f0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
13300 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
13310 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
13320 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63   /* A malloc() c
13330 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71  annot fail in sq
13340 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
13350 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ) as one or more
13360 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20   calls to .  ** 
13370 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61  malloc() must ha
13380 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
13390 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72  made by this thr
133a0 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65  ead before it ge
133b0 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ts.  ** to this 
133c0 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  point. This mean
133d0 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
133e0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
133f0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64  allocated alread
13400 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54  y.  ** so that T
13410 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
13420 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a   can be set..  *
13430 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  /.  ThreadData *
13440 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
13450 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73  readData();.  as
13460 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a  sert( pPager );.
13470 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26    assert( pTsd &
13480 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29  & pTsd->nAlloc )
13490 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  ;.#endif..  disa
134a0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
134b0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61  _errors();.  pPa
134c0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
134d0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
134e0 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
134f0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
13500 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  ger);.  pagerUnl
13510 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
13520 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
13530 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
13540 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
13550 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
13560 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13570 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
13580 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
13590 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
135a0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
135b0 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
135c0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
135d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
135e0 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
135f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
13600 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
13610 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
13620 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
13630 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
13640 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
13650 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
13660 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
13670 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
13680 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
13690 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
136a0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
136b0 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
136c0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
136d0 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
136e0 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
136f0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
13700 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
13710 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
13720 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
13730 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
13740 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
13750 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
13760 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
13770 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
13780 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
13790 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
137a0 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
137b0 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
137c0 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
137d0 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
137e0 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
137f0 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
13800 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
13810 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
13820 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
13830 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
13840 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
13850 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
13860 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
13870 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
13880 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
13890 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
138a0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
138b0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
138c0 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
138d0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
138e0 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ace);.  sqliteFr
138f0 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
13900 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13910 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
13920 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
13930 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
13940 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13950 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
13960 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
13970 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
13980 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
13990 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
139a0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
139b0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
139c0 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
139d0 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
139e0 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
139f0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
13a00 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
13a10 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
13a20 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
13a30 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
13a40 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
13a50 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
13a60 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
13a70 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
13a80 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
13a90 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
13aa0 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
13ab0 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
13ac0 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
13ad0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
13ae0 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
13af0 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
13b00 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
13b10 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
13b20 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
13b30 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
13b40 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
13b50 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
13b60 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
13b70 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
13b80 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
13b90 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
13ba0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
13bb0 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
13bc0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
13bd0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
13be0 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
13bf0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
13c00 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
13c10 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
13c20 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
13c30 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
13c40 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
13c50 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
13c60 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
13c70 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
13c80 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
13c90 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
13ca0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
13cb0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
13cc0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
13cd0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
13ce0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
13cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
13d00 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
13d10 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
13d20 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
13d30 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
13d40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13d50 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
13d60 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
13d70 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
13d80 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
13d90 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
13da0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
13db0 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
13dc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
13dd0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
13de0 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
13df0 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
13e00 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
13e10 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
13e20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13e30 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
13e40 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
13e50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
13e60 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
13e70 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
13e80 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
13e90 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
13ea0 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
13eb0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
13ec0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
13ed0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
13ee0 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
13ef0 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
13f00 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
13f10 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
13f20 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
13f30 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
13f40 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
13f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
13f70 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
13f80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
13f90 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
13fa0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
13fb0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
13fc0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
13fd0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
13fe0 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
13ff0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
14000 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
14010 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
14020 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
14030 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
14040 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
14050 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
14060 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
14070 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
14080 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
14090 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
140a0 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
140b0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
140c0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
140d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
140e0 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
140f0 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
14100 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
14110 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
14120 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
14130 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
14140 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
14150 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
14160 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
14170 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
14180 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
14190 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
141a0 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
141b0 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
141c0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
141d0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
141e0 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
141f0 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
14200 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
14210 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
14220 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
14230 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
14240 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
14250 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
14260 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
14270 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
14280 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
14290 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
142a0 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
142b0 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
142c0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
142d0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
142e0 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
142f0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
14300 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
14310 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
14320 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
14330 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
14340 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
14350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14360 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
14370 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
14380 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
14390 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
143a0 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
143b0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
143c0 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
143d0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
143e0 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
143f0 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
14400 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
14410 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
14420 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
14430 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
14440 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14450 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14460 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
14470 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
14480 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
14490 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
144a0 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
144b0 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
144c0 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
144d0 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
144e0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
144f0 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
14500 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
14510 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
14520 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
14530 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
14540 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
14550 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
14560 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
14570 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
14580 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
14590 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
145a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
145b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
145c0 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
145d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
145e0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
145f0 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
14600 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
14610 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14630 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
14640 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
14650 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
14660 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
14670 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
14680 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
14690 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
146a0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
146b0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
146c0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
146d0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
146e0 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
146f0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
14700 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
14710 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
14720 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
14730 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
14740 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
14750 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
14760 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
14770 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
14780 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
14790 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
147a0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
147b0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
147c0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
147d0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
147e0 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
147f0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
14800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14810 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
14820 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
14830 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
14840 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
14850 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
14860 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
14870 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
148a0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
148b0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
148c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
148d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
148e0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
148f0 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
14900 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
14920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
14930 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
14940 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
14950 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14960 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
14970 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
14980 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
14990 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
149a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
149b0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
149c0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
149d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
149e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
149f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14a00 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
14a10 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
14a20 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
14a30 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
14a40 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
14a50 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
14a60 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r)).      rc = s
14a70 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
14a80 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
14a90 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
14aa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
14ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14ac0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14ad0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
14ae0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
14af0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
14b00 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
14b10 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
14b20 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
14b30 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
14b40 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
14b50 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
14b60 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
14b70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
14b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
14b90 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
14ba0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
14bb0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
14bc0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
14bd0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
14be0 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
14bf0 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
14c00 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
14c10 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
14c20 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
14c30 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
14c40 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
14c50 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
14c60 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
14c70 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
14c80 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
14c90 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
14ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
14cb0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
14cc0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14cd0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
14ce0 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
14cf0 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
14d00 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
14d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
14d20 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
14d30 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
14d40 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
14d50 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
14d60 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
14d70 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
14d80 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
14d90 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
14da0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
14db0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
14dc0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
14dd0 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
14de0 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
14df0 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
14e00 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
14e10 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
14e20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
14e30 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
14e40 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
14e50 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
14e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14e70 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
14e80 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
14e90 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
14ea0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
14eb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
14ec0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
14ed0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
14ee0 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
14ef0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
14f00 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
14f10 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
14f20 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
14f30 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
14f40 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
14f50 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
14f60 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
14f70 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
14f80 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
14f90 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
14fa0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
14fb0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
14fc0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
14fd0 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
14fe0 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
14ff0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
15000 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
15010 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
15020 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
15030 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
15040 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
15050 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
15060 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
15070 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
15080 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
15090 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
150a0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
150b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
150c0 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
150d0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
150e0 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
150f0 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
15100 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
15110 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
15120 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
15130 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
15140 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
15150 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
15160 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
15170 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
15180 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
15190 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
151a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
151b0 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
151c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
151d0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
151e0 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
151f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15210 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
15220 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
15230 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
15240 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15250 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
15260 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
15270 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
15280 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
15290 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
152a0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
152b0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
152c0 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
152d0 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
152e0 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
152f0 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
15300 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
15310 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
15320 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
15330 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
15340 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
15350 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
15360 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
15370 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
15380 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
15390 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
153a0 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
153b0 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
153c0 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
153d0 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
153e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
153f0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
15400 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
15410 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
15420 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
15430 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
15440 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
15450 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
15460 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15470 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
15480 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
15490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
154a0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
154b0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
154c0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
154d0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
154e0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
154f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15500 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
15510 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
15520 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
15530 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
15540 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
15550 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
15560 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
15570 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
15580 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
15590 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
155a0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
155b0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
155c0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
155d0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
155e0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
155f0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
15600 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
15610 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
15620 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
15630 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
15640 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
15650 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
15660 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
15670 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
15680 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
15690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
156a0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
156b0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
156c0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
156d0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
156e0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
156f0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
15700 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
15710 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
15720 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
15730 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
15740 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
15750 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
15760 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
15770 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
15780 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
15790 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
157a0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
157b0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
157c0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
157d0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
157e0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
157f0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
15800 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
15810 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
15820 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
15830 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15840 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
15850 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
15860 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
15870 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
15880 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
15890 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
158a0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
158b0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
158c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
158d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
158e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
158f0 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67  pList = sort_pag
15900 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20  elist(pList);.  
15910 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
15920 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
15930 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
15940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
15950 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
15960 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
15970 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
15980 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
15990 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
159a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
159b0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
159c0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
159d0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
159e0 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
159f0 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
15a00 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
15a10 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
15a20 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
15a30 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
15a40 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
15a50 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
15a60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
15a70 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
15a80 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
15a90 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
15aa0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
15ab0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
15ac0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
15ad0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  {.      char *pD
15ae0 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ata = CODEC2(pPa
15af0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
15b00 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
15b10 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
15b20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
15b30 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
15b40 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
15b70 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
15b80 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
15b90 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
15ba0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
15bb0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
15bc0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
15bd0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15be0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
15bf0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
15c00 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
15c10 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
15c20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
15c30 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
15c40 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
15c50 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
15c60 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
15c70 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
15c80 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
15c90 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
15ca0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
15cb0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
15cc0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
15cd0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
15ce0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
15cf0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
15d00 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
15d10 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
15d20 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
15d30 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
15d40 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
15d50 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
15d60 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
15d70 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
15d80 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
15d90 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
15da0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
15db0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
15dc0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
15dd0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
15de0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15df0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
15e00 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
15e10 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
15e20 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
15e30 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
15e40 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
15e50 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
15e60 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
15e70 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
15e80 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
15e90 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
15ea0 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
15eb0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
15ec0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15ed0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15ee0 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
15ef0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15f00 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
15f10 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
15f20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
15f30 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
15f40 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
15f50 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
15f60 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15f70 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
15f80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15f90 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
15fa0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
15fb0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
15fc0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
15fd0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
15fe0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
15ff0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
16000 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
16010 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
16020 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
16030 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
16040 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
16050 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
16060 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
16070 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
16080 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
16090 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
160a0 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nal) ){.    retu
160b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
160c0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
160d0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
160e0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
160f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
16100 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
16110 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
16120 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
16130 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
16140 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
16150 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
16160 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
16170 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
16180 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
16190 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
161a0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
161b0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
161c0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
161d0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
161e0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
161f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
16200 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
16210 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
16220 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
16230 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16240 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
16250 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
16260 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
16270 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
16280 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
16290 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
162a0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
162b0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
162c0 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
162d0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
162e0 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
162f0 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
16300 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
16310 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
16320 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
16330 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
16340 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
16350 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
16360 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
16370 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
16380 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
16390 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
163a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
163b0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
163c0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
163d0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
163e0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
163f0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
16400 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
16410 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
16420 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
16430 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
16440 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
16450 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
16460 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16470 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
16480 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
16490 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
164a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
164b0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
164c0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
164d0 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
164e0 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
164f0 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
16500 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
16510 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
16520 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
16530 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
16540 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
16550 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
16560 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
16570 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
16580 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
16590 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
165a0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
165b0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
165c0 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
165d0 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
165e0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
165f0 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
16600 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
16610 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
16620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16630 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
16640 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
16650 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
16660 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
16670 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
16680 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
16690 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
166a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
166b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
166c0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
166d0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
166e0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
166f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16700 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
16710 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
16720 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
16730 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
16740 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16750 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
16760 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
16770 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
16780 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
16790 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
167a0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
167b0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
167c0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
167d0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
167e0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
167f0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
16800 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
16810 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16830 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16840 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
16850 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
16860 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
16870 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
16880 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
16890 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
168a0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
168b0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
168c0 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
168d0 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
168e0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
168f0 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
16900 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
16910 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
16920 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
16930 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
16940 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
16950 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
16960 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
16970 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
16980 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
16990 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
169a0 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
169b0 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
169c0 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
169d0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
169e0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
169f0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
16a00 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
16a10 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
16a20 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
16a30 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
16a40 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
16a50 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
16a60 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
16a70 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
16a80 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
16a90 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
16aa0 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
16ab0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
16ac0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
16ad0 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
16ae0 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
16af0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
16b00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
16b10 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
16b20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
16b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
16b50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
16b60 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
16b70 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
16b80 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
16b90 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
16ba0 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
16bb0 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
16bc0 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
16bd0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
16be0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
16bf0 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
16c00 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
16c10 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
16c20 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16c30 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
16c40 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
16c50 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
16c60 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
16c70 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
16c80 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
16c90 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
16ca0 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
16cb0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
16cc0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
16cd0 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
16ce0 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
16cf0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
16d00 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65  eased..*/.#if de
16d10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
16d20 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
16d30 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e  EMENT) && !defin
16d40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
16d50 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69 74  ISKIO).int sqlit
16d60 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
16d70 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
16d80 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
16d90 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c  ta *pTsdro = sql
16da0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
16db0 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20  adOnly();.  int 
16dc0 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20  nReleased = 0;. 
16dd0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66   int i;..  /* If
16de0 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20   the the global 
16df0 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74  mutex is held, t
16e00 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62  his subroutine b
16e10 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d  ecomes a.  ** o-
16e20 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f  op; zero bytes o
16e30 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65  f memory are fre
16e40 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  ed.  This is bec
16e50 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f  ause.  ** some o
16e60 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b  f the code invok
16e70 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
16e80 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a  ion may also.  *
16e90 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * try to obtain 
16ea0 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c  the mutex, resul
16eb0 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f  ting in a deadlo
16ec0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ck..  */.  if( s
16ed0 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
16ee0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
16ef0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75   0;.  }..  /* Ou
16f00 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e  termost loop run
16f10 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77  s for at most tw
16f20 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69  o iterations. Fi
16f30 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65  rst iteration we
16f40 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e  .  ** try to fin
16f50 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61  d memory that ca
16f60 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  n be released wi
16f70 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73  thout calling fs
16f80 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20  ync(). Second.  
16f90 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68  ** iteration (wh
16fa0 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66  ich only runs if
16fb0 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65   the first faile
16fc0 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62  d to free nReq b
16fd0 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d  ytes of.  ** mem
16fe0 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65  ory) is permitte
16ff0 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28  d to call fsync(
17000 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f  ). This is of co
17010 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a  urse much more .
17020 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a    ** expensive..
17030 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
17040 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  i<=1; i++){..   
17050 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
17060 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20   all the SQLite 
17070 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79  pagers opened by
17080 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
17090 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65  ead. */.    Page
170a0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64  r *pPager = pTsd
170b0 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  ro->pPager;.    
170c0 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26  for( ; pPager &&
170d0 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
170e0 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61  eased<nReq); pPa
170f0 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
17100 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
17110 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
17120 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d  rc;..      if( M
17130 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
17140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17150 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  }..      /* For 
17160 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20  each pager, try 
17170 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20  to free as many 
17180 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c  pages as possibl
17190 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20  e (without .    
171a0 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79    ** calling fsy
171b0 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20  nc() if this is 
171c0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
171d0 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ion of the outer
171e0 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c  most .      ** l
171f0 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oop)..      */. 
17200 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49       while( SQLI
17210 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67  TE_OK==(rc = pag
17220 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
17230 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20  r, i, &pPg)) && 
17240 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  pPg) {.        /
17250 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
17260 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
17270 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
17280 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
17290 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
172a0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
172b0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
172c0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
172d0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
172e0 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
172f0 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
17300 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
17310 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
17320 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
17330 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
17340 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
17350 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
17360 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
17370 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
17380 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
17390 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
173a0 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
173b0 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
173c0 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
173d0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
173e0 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
173f0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
17400 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
17410 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
17420 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
17430 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
17440 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  All;.        }el
17450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
17460 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e  r( pTmp=pPager->
17470 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
17480 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
17490 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
174a0 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
174b0 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
174c0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
174d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
174e0 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69  Released += sqli
174f0 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29  teAllocSize(pPg)
17500 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
17510 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
17520 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70   *\n", pPager, p
17530 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
17540 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
17550 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
17560 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
17570 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
17580 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Pg);.      }..  
17590 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
175a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
175b0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
175c0 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
175d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
175e0 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20  ase file or .   
175f0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
17600 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
17610 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
17620 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
17630 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
17640 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
17650 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  function. Instea
17660 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  d, set the Pager
17670 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
17680 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  e..        ** Th
17690 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
176a0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
176b0 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20  user (or users, 
176c0 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
176d0 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
176e0 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
176f0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
17700 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
17710 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
17720 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
17730 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
17740 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c    (rc&0xff)==SQL
17750 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
17760 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
17770 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
17780 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
17790 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20 20  TE_BUSY.        
177a0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
177b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
177c0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
177d0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
177e0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
177f0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
17800 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
17810 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65   nReleased;.}.#e
17820 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
17830 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
17840 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c 49  AGEMENT && !SQLI
17850 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a  TE_OMIT_DISKIO *
17860 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  /../*.** Read th
17870 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
17880 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65  e pPg out of the
17890 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
178a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
178b0 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a  adDbPage(Pager *
178c0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70  pPager, PgHdr *p
178d0 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Pg, Pgno pgno){.
178e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
178f0 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
17900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
17910 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
17920 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
17930 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
17940 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17960 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
17970 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44  pPager->fd, PGHD
17980 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a  R_TO_DATA(pPg),.
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
179b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
179c0 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71  .  PAGER_INCR(sq
179d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
179e0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47  db_count);.  PAG
179f0 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
17a00 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43  nRead);.  IOTRAC
17a10 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e  E(("PGIN %p %d\n
17a20 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
17a30 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  );.  if( pgno==1
17a40 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
17a50 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
17a60 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52  rs, &((u8*)PGHDR
17a70 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32  _TO_DATA(pPg))[2
17a80 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  4],.            
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ab0 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d    sizeof(pPager-
17ac0 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
17ad0 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67   }.  CODEC1(pPag
17ae0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
17af0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
17b00 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52  o, 3);.  PAGERTR
17b10 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70  ACE4("FETCH %d p
17b20 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
17b30 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
17b40 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17b50 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
17b60 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
17b70 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  pPg));.  return 
17b80 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
17b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
17ba0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
17bb0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17bc0 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a  required before.
17bd0 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72  ** data may be r
17be0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ead from the pag
17bf0 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
17c00 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73   shared lock has
17c10 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
17c20 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20   obtained, this 
17c30 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
17c40 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64  -op..**.** Immed
17c50 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74  iately after obt
17c60 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65  aining the share
17c70 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69  d lock (if requi
17c80 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74  red), this funct
17c90 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f  ion.** checks fo
17ca0 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  r a hot-journal 
17cb0 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20  file. If one is 
17cc0 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65  found, an emerge
17cd0 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  ncy rollback.** 
17ce0 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d  is performed imm
17cf0 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  ediately..*/.sta
17d00 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61  tic int pagerSha
17d10 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70  redLock(Pager *p
17d20 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
17d30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
17d40 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
17d50 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
17d60 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d   ){.    if( !MEM
17d70 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  DB ){.      asse
17d80 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
17d90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
17da0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64   !pPager->noRead
17db0 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
17dc0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17dd0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17de0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
17df0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17e10 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
17e20 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
17e30 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
17e40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17e50 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48  Pager->state>=SH
17e60 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
17e70 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a     }.  .      /*
17e80 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
17e90 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
17ea0 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
17eb0 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
17ec0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
17ed0 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
17ee0 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
17ef0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
17f00 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20  r deleted..     
17f10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61   */.      if( ha
17f20 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sHotJournal(pPag
17f30 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  er) ){.        /
17f40 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
17f50 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
17f60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
17f70 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
17f80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  s.        ** imp
17f90 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
17fa0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
17fb0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
17fc0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
17fd0 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
17fe0 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
17ff0 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
18000 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
18010 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  the.        ** d
18020 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
18030 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
18040 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
18050 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
18060 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
18070 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61  e is safe to rea
18080 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f  d while this pro
18090 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f  cess is still ro
180a0 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20  lling it .      
180b0 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20    ** back..     
180c0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a     ** .        *
180d0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
180e0 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
180f0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
18100 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
18110 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64         ** second
18120 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65   process will ge
18130 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20  t to this point 
18140 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20  in the code and 
18150 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  fail to.        
18160 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f  ** obtain it's o
18170 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
18180 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
18190 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  e file..        
181a0 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
181b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
181c0 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
181d0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
181e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
181f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18200 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
18210 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
18220 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
18230 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18240 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18250 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
18260 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
18270 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f  IVE;. .        /
18280 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
18290 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
182a0 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
182b0 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
182c0 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e      ** we are un
182d0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65  able to open the
182e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a   journal file. .
182f0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
18300 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
18310 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
18320 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
18330 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
18340 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61         ** journa
18350 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20  l file is never 
18360 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20  open unless the 
18370 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
18380 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20  le holds.       
18390 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
183a0 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
183b0 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
183c0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
183d0 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73        ** process
183e0 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a  es opening the j
183f0 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61  ournal at the sa
18400 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  me time..       
18410 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   **.        ** O
18420 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
18430 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
18440 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
18450 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
18460 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d     ** exclusive-
18470 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
18480 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18490 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65  will be kept ope
184a0 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  n and.        **
184b0 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66   possibly used f
184c0 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  or a transaction
184d0 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f   later on. On so
184e0 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a  me systems, the.
184f0 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75          ** OsTru
18500 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65  ncate() call use
18510 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61  d in exclusive-a
18520 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20  ccess mode also 
18530 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20  requires.       
18540 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65   ** a read/write
18550 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20   file handle..  
18560 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
18580 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  Y;.        if( s
18590 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
185a0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
185b0 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
185c0 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20    int ro;.      
185d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61      assert( !pPa
185e0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
185f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
18600 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
18610 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a  dWrite(pPager->z
18620 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
18630 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20  ->jfd, &ro);.   
18640 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
18650 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
18660 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20  pPager->jfd );. 
18670 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20           if( ro 
18680 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
18690 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
186a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
186b0 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
186c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
186d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
186e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
186f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18700 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e          pager_un
18710 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
18720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
18730 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
18740 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
18750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18760 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
18770 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
18780 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
18790 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
187a0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
187b0 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
187c0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
187d0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
187e0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
187f0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
18800 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
18810 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
18820 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
18830 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
18840 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
18850 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
18860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18870 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
18880 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
18890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
188a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
188b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
188c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
188d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
188e0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
188f0 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d  (pPager->state==
18900 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18910 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50  .            (pP
18920 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
18930 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73  ode && pPager->s
18940 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45  tate>PAGER_SHARE
18950 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  D).        );.  
18960 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
18970 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b   pPager->pAll ){
18980 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
18990 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20  shared-lock has 
189a0 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72  just been acquir
189b0 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
189c0 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20  se file.        
189d0 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
189e0 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69   already pages i
189f0 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f  n the cache (fro
18a00 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  m a previous.   
18a10 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20       ** read or 
18a20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
18a30 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  n).  Check to se
18a40 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
18a50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73  e.        ** has
18a60 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
18a70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
18a80 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
18a90 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20  ush the.        
18aa0 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20  ** cache..      
18ab0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
18ac0 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
18ad0 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
18ae0 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
18af0 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
18b00 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
18b10 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66  et 24 into the f
18b20 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20  ile.  The first 
18b30 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79  4 of these 16 by
18b40 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20  tes are.        
18b50 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e  ** a 32-bit coun
18b60 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ter that is incr
18b70 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
18b80 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20  h change.  The. 
18b90 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20         ** other 
18ba0 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e  bytes change ran
18bb0 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20  domly with each 
18bc0 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e  file change when
18bd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
18be0 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20  dec is in use.. 
18bf0 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
18c00 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61     ** There is a
18c10 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
18c20 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61  ll chance that a
18c30 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74   change will not
18c40 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   be .        ** 
18c50 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63  detected.  The c
18c60 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65  hance of an unde
18c70 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73  tected change is
18c80 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20   so small that. 
18c90 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e         ** it can
18ca0 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
18cb0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
18cc0 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72    char dbFileVer
18cd0 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s[sizeof(pPager-
18ce0 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20  >dbFileVers)];. 
18cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
18d00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
18d10 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  ger);..        i
18d20 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
18d30 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
18d40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
18d50 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  rrCode;.        
18d60 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  }..        if( p
18d70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
18d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  ){.          IOT
18d90 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70  RACE(("CKVERS %p
18da0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
18db0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
18dc0 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  s)));.          
18dd0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
18de0 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32  ek(pPager->fd, 2
18df0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  4);.          if
18e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
18e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18e40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
18e50 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ad(pPager->fd, &
18e60 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
18e70 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
18e80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
18e90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18ea0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
18eb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
18ec0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
18ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
18ee0 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
18ef0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
18f00 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
18f10 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
18f20 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
18f30 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
18f40 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
18f50 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
18f60 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
18f70 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
18f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
18f90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
18fa0 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
18fb0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
18fc0 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
18fd0 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
18fe0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
18ff0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
19000 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
19010 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
19020 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
19030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19040 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
19050 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20   PgHdr object.  
19060 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61   Either create a
19070 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73   new one or reus
19080 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  e.** an existing
19090 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74   one that is not
190a0 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73   otherwise in us
190b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50  e..**.** A new P
190c0 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69  gHdr structure i
190d0 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79  s created if any
190e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
190f0 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a  g are.** true:.*
19100 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
19110 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64   have not exceed
19120 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61  ed our maximum a
19130 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73  llocated cache s
19140 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ize.**          
19150 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50  as set by the "P
19160 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
19170 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  " command..**.**
19180 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
19190 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67  are no unused Pg
191a0 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69  Hdr objects avai
191b0 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69  lable at this ti
191c0 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33  me..**.**     (3
191d0 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e  )  This is an in
191e0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
191f0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20  ..**.**     (4) 
19200 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67   There are no Pg
19210 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74  Hdr objects that
19220 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20   do not require 
19230 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  a journal.**    
19240 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20        file sync 
19250 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68  and a sync of th
19260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
19270 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20  s currently.**  
19280 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74          prohibit
19290 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ed..**.** Otherw
192a0 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78  ise, reuse an ex
192b0 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49  isting PgHdr.  I
192c0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
192d0 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74  euse an.** exist
192e0 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c  ing PgHdr if all
192f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19300 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
19310 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61  *     (1)  We ha
19320 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78  ve reached or ex
19330 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d  ceeded the maxim
19340 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  um cache size.**
19350 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65            allowe
19360 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63  d by "PRAGMA cac
19370 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20  he_size"..**.** 
19380 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69      (2)  There i
19390 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61  s a PgHdr availa
193a0 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e  ble with PgHdr->
193b0 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20  nRef==0.**.**   
193c0 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f    (3)  We are no
193d0 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  t in an in-memor
193e0 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a  y database.**.**
193f0 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72       (4)  Either
19400 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61   there is an ava
19410 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61  ilable PgHdr tha
19420 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a  t does not need.
19430 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62  **          to b
19440 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  e synced to disk
19450 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79   or else disk sy
19460 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74  ncing is current
19470 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ly.**          a
19480 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  llowed..*/.stati
19490 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63  c int pagerAlloc
194a0 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70  atePage(Pager *p
194b0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70  Pager, PgHdr **p
194c0 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pPg){.  int rc =
194d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67   SQLITE_OK;.  Pg
194e0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
194f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48  Create a new PgH
19500 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  dr if any of the
19510 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73   four conditions
19520 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61   defined .  ** a
19530 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a  bove is met: */.
19540 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
19550 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
19560 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d  ge.   || pPager-
19570 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c  >pFirst==0 .   |
19580 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70  | MEMDB.   || (p
19590 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
195a0 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
195b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29  ->doNotSync).  )
195c0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
195d0 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d  ->nPage>=pPager-
195e0 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >nHash ){.      
195f0 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73  pager_resize_has
19600 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a  h_table(pPager,.
19610 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
19620 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
19630 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
19640 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *2);.      if( p
19650 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20  Pager->nHash==0 
19660 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19670 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
19680 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
19690 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
196a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
196b0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c   pPg = sqliteMal
196c0 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
196d0 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70  pPg) + pPager->p
196e0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
19710 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
19720 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ra.             
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
19740 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
19750 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
19760 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
19770 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
19780 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
19790 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
197a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
197b0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
197c0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
197d0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
197e0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
197f0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
19800 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
19810 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
19820 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
19830 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
19840 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
19850 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
19860 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  .    pPager->pAl
19870 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61  l = pPg;.    pPa
19880 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  ger->nPage++;.  
19890 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65  }else{.    /* Re
198a0 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e  cycle an existin
198b0 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65  g page with a ze
198c0 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f  ro ref-count. */
198d0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
198e0 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20  recycle(pPager, 
198f0 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66  1, &pPg);.    if
19900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
19910 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  Y ){.      rc = 
19920 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
19930 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CKED;.    }.    
19940 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19950 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
19960 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
19970 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ut;.    }.    as
19980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19990 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ate>=SHARED_LOCK
199a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70   );.    assert(p
199b0 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67  Pg);.  }.  *ppPg
199c0 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61   = pPg;..pager_a
199d0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72  llocate_out:.  r
199e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
199f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  ** Make sure we 
19a00 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  have the content
19a10 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66   for a page.  If
19a20 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a   the page was.**
19a30 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75   previously acqu
19a40 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74  ired with noCont
19a50 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  ent==1, then the
19a60 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20   content was.** 
19a70 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64  just initialized
19a80 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61   to zeros instea
19a90 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20  d of being read 
19aa0 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75  from disk..** Bu
19ab0 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68  t now we need th
19ac0 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20  e real data off 
19ad0 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b  of disk.  So mak
19ae0 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76  e sure we.** hav
19af0 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69  e it.  Read it i
19b00 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68  n if we do not h
19b10 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a  ave it already..
19b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19b30 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28  ger_get_content(
19b40 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
19b50 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64  f( pPg->needRead
19b60 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   ){.    int rc =
19b70 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d   readDbPage(pPg-
19b80 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50  >pPager, pPg, pP
19b90 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  g->pgno);.    if
19ba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19bb0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
19bc0 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
19bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
19be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
19bf0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
19c00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
19c10 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
19c20 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
19c30 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
19c40 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
19c50 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
19c60 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
19c70 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
19c80 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
19c90 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
19ca0 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
19cb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19cc0 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61  works for any pa
19cd0 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65  ge number greate
19ce0 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68  r than 0.  If th
19cf0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
19d00 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  le is smaller th
19d10 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
19d20 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61   page, then no a
19d30 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65  ctual disk.** re
19d40 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ad occurs and th
19d50 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f  e memory image o
19d60 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  f the page is in
19d70 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20  itialized to.** 
19d80 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20  all zeros.  The 
19d90 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e  extra data appen
19da0 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73  ded to a page is
19db0 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69   always initiali
19dc0 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20  zed.** to zeros 
19dd0 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
19de0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
19df0 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  into memory..**.
19e00 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69  ** The acquisiti
19e10 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f  on might fail fo
19e20 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e  r several reason
19e30 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73  s.  In all cases
19e40 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  ,.** an appropri
19e50 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
19e60 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
19e70 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
19e80 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65   NULL..**.** See
19e90 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
19ea0 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  erLookup().  Bot
19eb0 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
19ec0 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65  nd Lookup() atte
19ed0 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61  mpt.** to find a
19ee0 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d   page in the in-
19ef0 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72  memory cache fir
19f00 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  st.  If the page
19f10 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
19f20 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68  ** in memory, th
19f30 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  is routine goes 
19f40 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20  to disk to read 
19f50 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f  it in whereas Lo
19f60 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
19f70 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
19f80 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
19f90 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
19fa0 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
19fb0 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
19fc0 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
19fd0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
19fe0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
19ff0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
1a000 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  ce Lookup() neve
1a010 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
1a020 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
1a030 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
1a040 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
1a050 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  les..**.** If no
1a060 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65  Content is false
1a070 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  , the page conte
1a080 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79  nts are actually
1a090 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e   read from disk.
1a0a0 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74  .** If noContent
1a0b0 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61   is true, it mea
1a0c0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
1a0d0 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  t care about the
1a0e0 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
1a0f0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
1a100 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74   time, so do not
1a110 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e   do a disk read.
1a120 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
1a130 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  he.** page conte
1a140 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20  nt with zeros.  
1a150 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63  But mark the fac
1a160 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e  t that we have n
1a170 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63  ot read the.** c
1a180 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e  ontent by settin
1a190 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1a1a0 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65  Read flag.  Late
1a1b0 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c  r on, if .** sql
1a1c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1a1d0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
1a1e0 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68  is page or if th
1a1f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
1a200 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69   called again wi
1a210 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c  th noContent==0,
1a220 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
1a230 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20   the content is 
1a240 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68  needed.** and th
1a250 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75  e disk read shou
1a260 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
1a270 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   point..*/.int s
1a280 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
1a290 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  re(.  Pager *pPa
1a2a0 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ger,      /* The
1a2b0 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74   pager open on t
1a2c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a2d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
1a2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1a2f0 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63  e number to fetc
1a300 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a  h */.  DbPage **
1a310 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72  ppPage,    /* Wr
1a320 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ite a pointer to
1a330 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a   the page here *
1a340 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
1a350 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  t       /* Do no
1a360 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67  t bother reading
1a370 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
1a380 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  sk if true */.){
1a390 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1a3a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a3b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1a3c0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1a3d0 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  || pPager->nRef>
1a3e0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a  0 || pgno==1 );.
1a3f0 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75  .  /* The maximu
1a400 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  m page number is
1a410 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51   2^31. Return SQ
1a420 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
1a430 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62  a page.  ** numb
1a440 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
1a450 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69  this, or zero, i
1a460 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1a470 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47  /.  if( pgno>PAG
1a480 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70  ER_MAX_PGNO || p
1a490 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
1a4a0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1a4b0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
1a4c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1a4d0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
1a4e0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20  /* Make sure we 
1a4f0 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79  have not hit any
1a500 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73   critical errors
1a510 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74  ..  */ .  assert
1a520 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
1a530 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
1a540 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1a550 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1a560 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1a570 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1a580 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1a590 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  e;.  }..  /* If 
1a5a0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1a5b0 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c  t page accessed,
1a5c0 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52   then get a SHAR
1a5d0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20  ED lock.  ** on 
1a5e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a5f0 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  e. pagerSharedLo
1a600 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
1a610 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62  if .  ** a datab
1a620 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65  ase lock is alre
1a630 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20  ady held..  */. 
1a640 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65   rc = pagerShare
1a650 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  dLock(pPager);. 
1a660 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a670 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a680 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1a690 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1a6a0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
1a6b0 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
1a6c0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
1a6d0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
1a6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1a6f0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1a700 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70   is not in the p
1a710 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
1a720 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20    int nMax;.    
1a730 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52  int h;.    PAGER
1a740 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
1a750 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  iss);.    rc = p
1a760 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65  agerAllocatePage
1a770 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a  (pPager, &pPg);.
1a780 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a790 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a7a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a7b0 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
1a7c0 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72   pgno;.    asser
1a7d0 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e  t( !MEMDB || pgn
1a7e0 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  o>pPager->stmtSi
1a7f0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ze );.    if( pP
1a800 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a810 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
1a820 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1a830 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
1a840 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50  e3CheckMemory(pP
1a850 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a860 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20  , pgno/8);.     
1a870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a880 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1a890 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1a8a0 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e  rnal = (pPager->
1a8b0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f  aInJournal[pgno/
1a8c0 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
1a8d0 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50  )))!=0;.      pP
1a8e0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
1a8f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a900 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1a910 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
1a920 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
1a930 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c     }..    makeCl
1a940 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
1a950 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  g->nRef = 1;.   
1a960 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
1a970 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
1a980 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
1a990 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
1a9a0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1a9b0 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
1a9c0 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
1a9d0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
1a9e0 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73    }.    nMax = s
1a9f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1aa00 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1aa10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1aa20 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73  rCode ){.      s
1aa30 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1aa40 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20  (pPg);.      rc 
1aa50 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
1aa60 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e;.      return 
1aa70 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
1aa80 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
1aa90 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
1aaa0 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
1aab0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1aac0 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
1aad0 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
1aae0 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
1aaf0 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
1ab00 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
1ab10 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
1ab20 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
1ab30 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1ab40 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
1ab50 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1ab60 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
1ab70 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ab80 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1ab90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1aba0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
1abb0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
1abc0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1abd0 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
1abe0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
1abf0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
1ac00 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
1ac10 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1ac20 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
1ac30 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
1ac40 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1ac50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ac60 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
1ac70 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
1ac80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1ac90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1aca0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1acb0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
1acc0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
1acd0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
1ace0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1acf0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
1ad00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ad10 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
1ad20 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
1ad30 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
1ad40 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
1ad50 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
1ad60 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
1ad70 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
1ad80 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
1ad90 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
1ada0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1adb0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1adc0 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
1add0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
1ade0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
1adf0 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
1ae00 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
1ae10 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
1ae20 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
1ae30 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
1ae40 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1ae50 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
1ae60 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1ae70 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
1ae80 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1ae90 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
1aea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1aeb0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1aec0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
1aed0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
1aee0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
1aef0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1af00 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
1af10 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
1af20 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
1af30 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
1af40 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
1af50 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
1af60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1af70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1af80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1af90 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
1afa0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
1afb0 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
1afc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1afd0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69  Acquire a page i
1afe0 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
1aff0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1b000 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e   cache.  Do.** n
1b010 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65  ot read the page
1b020 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74   from disk.  Ret
1b030 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1b040 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72   the page,.** or
1b050 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69   0 if the page i
1b060 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a  s not in cache..
1b070 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
1b080 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1b090 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
1b0a0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
1b0b0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
1b0c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
1b0d0 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77  is that _get() w
1b0e0 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69  ill go to the di
1b0f0 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69  sk and read.** i
1b100 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68  n the page if th
1b110 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c  e page is not al
1b120 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20  ready in cache. 
1b130 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1b140 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66   returns NULL if
1b150 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1b160 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20   in cache or if 
1b170 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72  a disk I/O error
1b180 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61   .** has ever ha
1b190 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67  ppened..*/.DbPag
1b1a0 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c  e *sqlite3PagerL
1b1b0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
1b1c0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
1b1d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
1b1e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b1f0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1b200 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69   pgno!=0 );..  i
1b210 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1b220 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1b230 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1b240 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70  Pager->pAll || p
1b250 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
1b260 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75  Mode );.    retu
1b270 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
1b280 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1b290 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1b2a0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
1b2b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b2c0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
1b2d0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1b2e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1b2f0 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
1b300 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
1b310 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
1b320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1b330 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1b340 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1b350 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1b360 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
1b370 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1b380 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
1b390 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
1b3a0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
1b3b0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
1b3c0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
1b3d0 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
1b3e0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
1b3f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1b400 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
1b410 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b420 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
1b430 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44  e *pPg){..  /* D
1b440 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
1b450 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
1b460 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
1b470 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1b480 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
1b490 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
1b4a0 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b  O(pPg);..  CHECK
1b4b0 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
1b4c0 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
1b4d0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1b4e0 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
1b4f0 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
1b500 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
1b510 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
1b520 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
1b530 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
1b540 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ef==0 ){.    Pag
1b550 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
1b560 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b570 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70  ager;.    pPg->p
1b580 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20  NextFree = 0;.  
1b590 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
1b5a0 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74   = pPager->pLast
1b5b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c  ;.    pPager->pL
1b5c0 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69  ast = pPg;.    i
1b5d0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
1b5e0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
1b5f0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
1b600 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20  Free = pPg;.    
1b610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1b620 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
1b630 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
1b640 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
1b650 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69  0 && pPager->pFi
1b660 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a  rstSynced==0 ){.
1b670 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46        pPager->pF
1b680 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67  irstSynced = pPg
1b690 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b6a0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1b6b0 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  tor ){.      pPa
1b6c0 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
1b6d0 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
1b6e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1b6f0 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
1b700 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
1b710 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
1b720 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
1b730 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
1b740 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
1b750 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
1b760 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
1b770 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1b780 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
1b790 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1b7a0 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63  && (!pPager->exc
1b7b0 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1b7c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b7d0 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67  >0) ){.      pag
1b7e0 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62  erUnlockAndRollb
1b7f0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1b800 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1b820 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75  .** Create a jou
1b830 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50  rnal file for pP
1b840 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f  ager.  There sho
1b850 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61  uld already be a
1b860 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20   RESERVED.** or 
1b870 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
1b880 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1b890 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ile when this ro
1b8a0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1b8b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
1b8c0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
1b8d0 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61  thing.  Return a
1b8e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  n error code and
1b8f0 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20   release the.** 
1b900 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e  write lock if an
1b910 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
1b920 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1b930 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1b940 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
1b950 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1b960 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1b970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1b980 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1b990 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
1b9a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1b9b0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
1b9c0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b9d0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1b9e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b9f0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1ba00 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
1ba10 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1ba20 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
1ba30 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1ba40 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1ba50 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1ba60 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1ba70 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
1ba80 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ba90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
1baa0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1bab0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72  journal;.  }.  r
1bac0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1bad0 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65  nExclusive(pPage
1bae0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
1baf0 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb10 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1bb20 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
1bb30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1bb40 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1bb50 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67 65  ->jfd );.  pPage
1bb60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
1bb70 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
1bb80 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
1bb90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1bba0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
1bbb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1bbc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bbd0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
1bbe0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
1bbf0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
1bc00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f  ;.    }.    goto
1bc10 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
1bc20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73  journal;.  }.  s
1bc30 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53  qlite3OsSetFullS
1bc40 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
1bc50 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
1bc60 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  ync);.  sqlite3O
1bc70 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61  sSetFullSync(pPa
1bc80 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
1bc90 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20  >full_fsync);.  
1bca0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
1bcb0 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a  ectory(pPager->j
1bcc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  fd, pPager->zDir
1bcd0 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65  ectory);.  pPage
1bce0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1bcf0 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
1bd00 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
1bd10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
1bd20 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
1bd30 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
1bd40 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
1bd50 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
1bd60 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1bd70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
1bd80 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1bd90 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
1bda0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
1bdb0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72    }.  pPager->or
1bdc0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1bdd0 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63  r->dbSize;..  rc
1bde0 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1bdf0 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  dr(pPager);..  i
1be00 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  f( pPager->stmtA
1be10 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53  utoopen && rc==S
1be20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1be40 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65  rStmtBegin(pPage
1be50 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
1be60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1be70 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
1be80 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
1be90 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
1bea0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
1beb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1bec0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1bed0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
1bee0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1bef0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
1bf00 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
1bf10 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
1bf20 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
1bf30 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1bf40 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
1bf50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
1bf60 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
1bf70 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1bf80 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
1bf90 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
1bfa0 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
1bfb0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
1bfc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
1bfd0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1bfe0 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
1bff0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1c000 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1c010 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
1c020 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
1c030 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
1c040 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1c050 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1c060 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
1c070 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
1c080 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
1c090 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
1c0a0 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
1c0b0 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
1c0c0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
1c0d0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1c0e0 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
1c0f0 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
1c100 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
1c110 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
1c120 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
1c130 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
1c140 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
1c150 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
1c160 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
1c170 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
1c180 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
1c190 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
1c1a0 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
1c1b0 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
1c1c0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
1c1d0 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
1c1e0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
1c1f0 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
1c200 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
1c210 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
1c220 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
1c230 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
1c240 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
1c250 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
1c260 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
1c270 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
1c280 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
1c290 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
1c2a0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
1c2b0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
1c2c0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
1c2d0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
1c2e0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
1c2f0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1c300 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
1c310 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
1c320 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c330 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1c340 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
1c350 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
1c360 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
1c370 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
1c380 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
1c390 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
1c3a0 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
1c3b0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
1c3c0 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
1c3d0 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
1c3e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
1c3f0 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
1c400 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1c410 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
1c420 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
1c430 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
1c440 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1c450 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
1c460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
1c470 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
1c480 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1c490 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c4a0 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
1c4b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1c4c0 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
1c4d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c4e0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1c4f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
1c500 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
1c510 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1c520 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1c530 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
1c540 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1c550 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
1c560 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1c570 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
1c580 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
1c590 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
1c5a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c5b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
1c5c0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1c5d0 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20  ER_RESERVED;.   
1c5e0 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20       if( exFlag 
1c5f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c600 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
1c610 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
1c620 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
1c630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c660 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1c670 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
1c680 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1c690 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54   0;.      PAGERT
1c6a0 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
1c6b0 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
1c6c0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1c6d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
1c6e0 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
1c6f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
1c700 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
1c710 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
1c720 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1c730 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
1c740 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
1c750 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1c760 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
1c770 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1c780 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65  happens when the
1c790 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78   pager was in ex
1c7a0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
1c7b0 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20  ode last.    ** 
1c7c0 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20  time a (read or 
1c7d0 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69  write) transacti
1c7e0 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75  on was successfu
1c7f0 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20  lly concluded.  
1c800 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e    ** by this con
1c810 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64  nection. Instead
1c820 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65   of deleting the
1c830 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74   journal file it
1c840 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70   was .    ** kep
1c850 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63  t open and trunc
1c860 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e  ated to 0 bytes.
1c870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1c880 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  rt( pPager->nRec
1c890 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1c8a0 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
1c8b0 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  bSize==0 );.    
1c8c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c8d0 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
1c8e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1c8f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1c900 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
1c910 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
1c920 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1c930 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1c940 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
1c950 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
1c960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1c970 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
1c980 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
1c990 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
1c9a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1c9b0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
1c9c0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
1c9d0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1c9e0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1c9f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
1ca00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1ca10 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c  Off>0 || rc!=SQL
1ca20 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75  ITE_OK );.  retu
1ca30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ca40 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
1ca50 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
1ca60 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
1ca70 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
1ca80 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
1ca90 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1caa0 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
1cab0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1cac0 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
1cad0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1cae0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
1caf0 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
1cb00 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
1cb10 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
1cb20 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1cb30 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
1cb40 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
1cb50 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
1cb60 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
1cb70 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
1cb80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
1cb90 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
1cba0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
1cbb0 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
1cbc0 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
1cbd0 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
1cbe0 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
1cbf0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1cc00 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
1cc10 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
1cc20 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
1cc30 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
1cc40 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
1cc50 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
1cc60 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72  .      pPg->pDir
1cc70 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1cc80 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1cc90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cca0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1ccb0 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
1ccc0 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
1ccd0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
1cce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ccf0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
1cd00 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
1cd10 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
1cd20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
1cd30 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
1cd40 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
1cd50 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
1cd60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
1cd70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1cd80 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
1cd90 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
1cda0 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
1cdb0 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
1cdc0 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
1cdd0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
1cde0 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
1cdf0 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
1ce00 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
1ce10 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
1ce20 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
1ce30 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
1ce40 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
1ce50 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
1ce60 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
1ce70 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
1ce80 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1ce90 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
1cea0 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
1ceb0 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
1cec0 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
1ced0 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
1cee0 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
1cef0 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
1cf00 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
1cf10 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1cf20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1cf30 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
1cf40 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
1cf50 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
1cf60 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
1cf70 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
1cf80 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1cf90 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
1cfa0 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
1cfb0 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
1cfc0 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
1cfd0 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
1cfe0 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
1cff0 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
1d000 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
1d010 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1d020 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
1d030 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
1d040 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
1d050 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1d060 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
1d070 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
1d080 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
1d090 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72  TA(pPg);.  Pager
1d0a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1d0b0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1d0c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1d0d0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
1d0e0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
1d0f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d100 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
1d110 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1d120 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d130 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
1d140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d150 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
1d160 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
1d170 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
1d180 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1d190 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
1d1a0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
1d1b0 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
1d1c0 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61  oContent==1, tha
1d1d0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20  t means.  ** we 
1d1e0 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65  didn't really re
1d1f0 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ad in the conten
1d200 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  t of the page.  
1d210 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
1d220 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c    ** (for exampl
1d230 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  e) when the page
1d240 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20   is being moved 
1d250 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1d260 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77    But.  ** now w
1d270 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20  e are (perhaps) 
1d280 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20  moving the page 
1d290 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  off of the freel
1d2a0 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75  ist for.  ** reu
1d2b0 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  se and we need t
1d2c0 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69  o know its origi
1d2d0 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74  nal content so t
1d2e0 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  hat content.  **
1d2f0 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
1d300 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
1d310 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74  ournal.  So do t
1d320 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a  he read at this.
1d330 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a    ** time..  */.
1d340 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
1d350 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
1d360 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1d370 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1d380 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1d390 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
1d3a0 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
1d3b0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1d3c0 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
1d3d0 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
1d3e0 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
1d3f0 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
1d400 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1d410 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1d420 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65   && (pageInState
1d430 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61  ment(pPg) || pPa
1d440 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
1d450 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
1d460 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1d470 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1d480 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1d490 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1d4a0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1d4b0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1d4c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1d4d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1d4e0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1d4f0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1d500 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1d510 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1d520 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1d530 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1d540 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1d550 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1d560 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1d570 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1d580 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d590 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1d5a0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1d5b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1d5c0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1d5d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d5e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1d5f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d610 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d620 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1d630 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1d640 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1d650 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
1d660 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1d670 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1d680 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1d690 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d6a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1d6b0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1d6c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1d6d0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
1d6e0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
1d6f0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1d700 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
1d710 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1d720 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
1d730 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
1d740 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
1d750 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1d760 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1d770 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1d780 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
1d790 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
1d7a0 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
1d7b0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
1d7c0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1d7d0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1d7e0 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
1d7f0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
1d800 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1d810 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
1d820 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
1d830 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1d840 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1d850 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
1d860 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
1d870 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
1d880 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1d890 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1d8a0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1d8b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1d8c0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
1d8d0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1d8e0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d8f0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1d900 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1d910 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
1d920 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1d930 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
1d940 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
1d950 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1d960 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1d970 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
1d980 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1d990 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
1d9a0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1d9b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d9c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1d9d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1d9e0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1d9f0 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  m, saved;.      
1da00 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1da10 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20  , *pEnd;.       
1da20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1da30 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1da40 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1da50 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1da60 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1da70 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
1da80 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
1da90 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
1daa0 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
1dab0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1dac0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
1dad0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1dae0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1daf0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1db00 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1db10 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1db20 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1db30 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
1db40 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
1db50 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
1db60 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
1db70 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32     pEnd = pData2
1db80 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
1db90 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
1dba0 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20  Data2 -= 4;.    
1dbb0 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
1dbc0 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20  u32*)pEnd;.     
1dbd0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1dbe0 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  End, cksum);.   
1dbf0 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
1dc00 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
1dc10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1dc20 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1dc30 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1dc40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dc50 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1dc60 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50  jfd, pData2, szP
1dc70 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  g);.          IO
1dc80 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1dc90 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1dca0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1dcb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1dcc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1dcd0 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b  rnalOff, szPg));
1dce0 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
1dcf0 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
1dd00 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
1dd10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
1dd20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1dd30 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20  += szPg;.       
1dd40 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22     PAGERTRACE5("
1dd50 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1dd60 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68  %d needSync=%d h
1dd70 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1dd90 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1dda0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1ddb0 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61  edSync, pager_pa
1ddc0 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20  gehash(pPg));.  
1ddd0 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70          *(u32*)p
1dde0 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 20 20  End = saved;..  
1ddf0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
1de00 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
1de10 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
1de20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1de30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
1de40 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1de50 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1de60 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1de70 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1de80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1de90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dea0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1deb0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1dec0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
1ded0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
1dee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1def0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1df00 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
1df10 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1df20 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1df30 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1df40 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
1df50 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1df60 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1df70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1df80 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1df90 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1dfa0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1dfb0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1dfc0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1dfd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1dfe0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dff0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
1e000 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
1e010 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1e020 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
1e030 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1e040 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41    PAGERTRACE4("A
1e050 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64  PPEND %d page %d
1e060 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
1e070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e080 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1e090 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  , pPg->pgno, pPg
1e0a0 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20  ->needSync);.   
1e0b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
1e0c0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1e0d0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1e0e0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1e0f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1e100 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1e110 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
1e120 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  If the statement
1e130 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e   journal is open
1e140 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73   and the page is
1e150 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20   not in it,.    
1e160 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
1e170 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1e180 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  o the statement 
1e190 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74  journal.  Note t
1e1a0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  hat.    ** the s
1e1b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1e1c0 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20   format differs 
1e1d0 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72  from the standar
1e1e0 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  d journal format
1e1f0 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20  .    ** in that 
1e200 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65  it omits the che
1e210 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68  cksums and the h
1e220 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  eader..    */.  
1e230 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1e240 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26  mtInUse .     &&
1e250 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
1e260 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20  t(pPg) .     && 
1e270 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1e280 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1e290 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61   .    ){.      a
1e2a0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1e2b0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1e2c0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1e2d0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1e2e0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
1e2f0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1e300 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1e310 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1e320 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1e330 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
1e340 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
1e350 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
1e360 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1e370 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
1e380 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
1e390 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
1e3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
1e3b0 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
1e3c0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1e3d0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
1e3e0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1e3f0 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
1e400 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
1e410 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1e420 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1e430 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1e440 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64  .        page_ad
1e450 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1e460 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
1e470 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1e480 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28  pData2 = CODEC2(
1e490 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
1e4a0 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a  Pg->pgno, 7)-4;.
1e4b0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1e4c0 73 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70  s(pData2, pPg->p
1e4d0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63  gno);.        rc
1e4e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1e4f0 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  e(pPager->stfd, 
1e500 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e  pData2, pPager->
1e510 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20  pageSize+4);.   
1e520 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1e530 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1e540 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1e550 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1e560 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1e570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e590 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e5a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
1e5b0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
1e5c0 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
1e5d0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1e5e0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
1e5f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1e600 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1e610 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1e620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
1e640 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  e the database s
1e650 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  ize and return..
1e660 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1e670 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1e680 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20  GER_SHARED );.  
1e690 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1e6a0 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  ze<(int)pPg->pgn
1e6b0 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1e6c0 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  >dbSize = pPg->p
1e6d0 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  gno;.    if( !ME
1e6e0 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1e6f0 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  bSize==PENDING_B
1e700 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65  YTE/pPager->page
1e710 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Size ){.      pP
1e720 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a  ager->dbSize++;.
1e730 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e740 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e750 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1e760 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20   used to mark a 
1e770 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69  data-page as wri
1e780 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a  table. It uses .
1e790 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29  ** pager_write()
1e7a0 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e   to open a journ
1e7b0 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69  al file (if it i
1e7c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1e7d0 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  en).** and write
1e7e0 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61   the page *pData
1e7f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   to the journal.
1e800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
1e810 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
1e820 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
1e830 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
1e840 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75   that this.** fu
1e850 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c  nction also deal
1e860 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  s with the speci
1e870 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20  al case where 2 
1e880 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a  or more pages.**
1e890 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65   fit on a single
1e8a0 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e   disk sector. In
1e8b0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63   this case all c
1e8c0 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73  o-resident pages
1e8d0 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65  .** must have be
1e8e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
1e8f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62  e journal file b
1e900 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1e910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1e920 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65  agerWrite(DbPage
1e930 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e   *pDbPage){.  in
1e940 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1e950 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ;..  PgHdr *pPg 
1e960 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67  = pDbPage;.  Pag
1e970 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1e980 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f  ->pPager;.  Pgno
1e990 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20   nPagePerSector 
1e9a0 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  = (pPager->secto
1e9b0 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61  rSize/pPager->pa
1e9c0 67 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20  geSize);..  if( 
1e9d0 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50  !MEMDB && nPageP
1e9e0 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20  erSector>1 ){.  
1e9f0 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e    Pgno nPageCoun
1ea00 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t;          /* T
1ea10 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
1ea20 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
1ea30 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e   file */.    Pgn
1ea40 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20  o pg1;          
1ea50 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1ea60 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
1ea70 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
1ea80 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  d on. */.    int
1ea90 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
1eaa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1eab0 20 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69   of pages starti
1eac0 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75  ng at pg1 to jou
1ead0 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rnal */.    int 
1eae0 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  ii;..    /* Set 
1eaf0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
1eb00 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
1eb10 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
1eb20 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
1eb30 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
1eb40 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
1eb50 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
1eb60 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
1eb70 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
1eb80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1eb90 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1eba0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  c==0 );.    pPag
1ebb0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1ebc0 31 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  1;..    /* This 
1ebd0 74 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68  trick assumes th
1ebe0 61 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65  at both the page
1ebf0 2d 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72  -size and sector
1ec00 2d 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a  -size are.    **
1ec10 20 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65   an integer powe
1ec20 72 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20  r of 2. It sets 
1ec30 76 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20  variable pg1 to 
1ec40 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
1ec50 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72     ** of the fir
1ec60 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73  st page of the s
1ec70 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63  ector pPg is loc
1ec80 61 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  ated on..    */.
1ec90 20 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d      pg1 = ((pPg-
1eca0 3e 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61  >pgno-1) & ~(nPa
1ecb0 67 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20  gePerSector-1)) 
1ecc0 2b 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43  + 1;..    nPageC
1ecd0 6f 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61  ount = sqlite3Pa
1ece0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1ecf0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ger);.    if( pP
1ed00 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
1ed10 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1ed20 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
1ed30 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
1ed40 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
1ed50 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
1ed60 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
1ed70 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
1ed80 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
1ed90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
1eda0 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
1edb0 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
1edc0 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
1edd0 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
1ede0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1edf0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
1ee00 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
1ee10 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
1ee20 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
1ee30 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
1ee40 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
1ee50 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66  pg1+ii;.      if
1ee60 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ( !pPager->aInJo
1ee70 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67  urnal || pg==pPg
1ee80 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20  ->pgno || .     
1ee90 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e       pg>pPager->
1eea0 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28  origDbSize || !(
1eeb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1eec0 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67  al[pg/8]&(1<<(pg
1eed0 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a  &7))).      ) {.
1eee0 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
1eef0 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1ef00 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
1ef10 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b     PgHdr *pPage;
1ef20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ef30 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1ef40 70 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61  pPager, pg, &pPa
1ef50 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
1ef60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ef70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ef80 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1ef90 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1efa0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1efb0 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  rUnref(pPage);. 
1efc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1efd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1efe0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
1eff0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1f000 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67  c==1 );.    pPag
1f010 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20  er->doNotSync = 
1f020 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1f030 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1f040 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20  (pDbPage);.  }. 
1f050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f060 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1f070 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
1f080 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
1f090 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
1f0a0 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
1f0b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f0c0 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
1f0d0 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
1f0e0 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
1f0f0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
1f100 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
1f110 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  e..*/.#ifndef ND
1f120 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33  EBUG.int sqlite3
1f130 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
1f140 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
1f150 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
1f160 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ty;.}.#endif..#i
1f170 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f180 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
1f190 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
1f1a0 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
1f1b0 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
1f1c0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
1f1d0 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
1f1e0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1f1f0 33 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28  3PagerOverwrite(
1f200 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1f210 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
1f220 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
1f230 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
1f240 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1f250 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1f260 70 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69  pgno, &pPg);.  i
1f270 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f280 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1f290 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1f2a0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
1f2b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f2c0 20 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74      memcpy(sqlit
1f2d0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1f2e0 50 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67  Pg), pData, pPag
1f2f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f300 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f310 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1f320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f330 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f340 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1f350 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1f360 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
1f370 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1f380 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
1f390 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
1f3a0 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
1f3b0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
1f3c0 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
1f3d0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
1f3e0 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
1f3f0 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
1f400 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
1f410 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
1f420 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
1f430 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
1f440 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
1f450 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
1f460 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
1f470 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
1f480 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
1f490 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
1f4a0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
1f4b0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
1f4c0 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
1f4d0 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
1f4e0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
1f4f0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1f500 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
1f510 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
1f520 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
1f530 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
1f540 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
1f550 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
1f560 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
1f570 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
1f580 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
1f590 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
1f5a0 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
1f5b0 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
1f5c0 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1f5d0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1f5e0 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
1f5f0 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
1f600 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
1f610 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
1f620 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
1f630 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
1f640 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
1f650 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
1f660 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
1f670 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
1f680 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
1f690 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
1f6a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
1f6b0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
1f6c0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
1f6d0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1f6e0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
1f6f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1f700 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1f710 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1f720 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1f730 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1f740 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1f750 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
1f760 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
1f770 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
1f780 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
1f790 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
1f7a0 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
1f7b0 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
1f7c0 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
1f7d0 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
1f7e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
1f7f0 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
1f800 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1f810 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
1f820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1f830 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
1f840 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
1f850 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
1f860 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
1f870 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1f880 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
1f890 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50  B ) return;.  pP
1f8a0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1f8b0 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
1f8c0 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
1f8d0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1f8e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1f8f0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1f900 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
1f910 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
1f920 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
1f930 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
1f940 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
1f950 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
1f960 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1f970 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
1f980 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
1f990 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
1f9a0 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
1f9b0 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
1f9c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
1f9d0 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
1f9e0 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
1f9f0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
1fa00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fa10 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
1fa20 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
1fa30 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
1fa40 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
1fa50 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
1fa60 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
1fa70 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
1fa80 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
1fa90 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
1faa0 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
1fab0 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
1fac0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
1fad0 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
1fae0 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
1faf0 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
1fb00 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
1fb10 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
1fb20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
1fb30 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
1fb40 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1fb50 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
1fb60 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1fb70 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
1fb80 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1fb90 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1fba0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1fbb0 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
1fbc0 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
1fbd0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1fbe0 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
1fbf0 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
1fc00 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1fc10 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
1fc20 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1fc30 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1fc40 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  if.    }.  }.}..
1fc50 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
1fc60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
1fc70 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
1fc80 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20  t if a rollback 
1fc90 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73  occurs,.** it is
1fca0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
1fcb0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
1fcc0 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ta on the given 
1fcd0 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d  page.  This.** m
1fce0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
1fcf0 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ger does not hav
1fd00 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  e to record the 
1fd10 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68  given page in th
1fd20 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  e.** rollback jo
1fd30 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
1fd40 77 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20  we have not yet 
1fd50 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68  actually read th
1fd60 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69  e content of thi
1fd70 73 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68  s page (if.** th
1fd80 65 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64  e PgHdr.needRead
1fd90 20 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68   flag is set) th
1fda0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1fdb0 61 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73  acts as a promis
1fdc0 65 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c  e.** that we wil
1fdd0 6c 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20  l never need to 
1fde0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f  read the page co
1fdf0 6e 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74  ntent in the fut
1fe00 75 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e  ure..** so the n
1fe10 65 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e  eedRead flag can
1fe20 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74   be cleared at t
1fe30 68 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f  his point..*/.vo
1fe40 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
1fe50 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61  ontRollback(DbPa
1fe60 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
1fe70 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1fe80 3e 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65  >pPager;..  asse
1fe90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1fea0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1feb0 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  D );.  if( pPage
1fec0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
1fed0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1fee0 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
1fef0 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
1ff00 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1ff10 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  || MEMDB ) retur
1ff20 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
1ff30 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
1ff40 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
1ff50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ff60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ff70 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ff80 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
1ff90 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1ffa0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1ffb0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1ffc0 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
1ffd0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50  rnal = 1;.    pP
1ffe0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b  g->needRead = 0;
1fff0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
20000 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
20010 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
20020 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
20030 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
20040 6f 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  o&7);.    }.    
20050 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
20060 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20  T_ROLLBACK page 
20070 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67  %d of %d\n", pPg
20080 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
20090 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f  pPager));.    IO
200a0 54 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20  TRACE(("GARBAGE 
200b0 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
200c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
200d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
200e0 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26  stmtInUse .   &&
200f0 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e   !pageInStatemen
20100 74 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69  t(pPg) .   && (i
20110 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
20120 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a  ager->stmtSize .
20130 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
20140 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
20150 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
20160 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
20170 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
20180 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
20190 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
201a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
201b0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
201c0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
201d0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
201e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
201f0 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
20200 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
20210 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
20220 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
20230 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
20240 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
20250 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
20260 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
20270 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
20280 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  ){.  PgHdr *pPgH
20290 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
202a0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
202b0 72 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  rc;..  if( !pPag
202c0 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
202d0 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  one ){.    /* Op
202e0 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
202f0 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
20300 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
20310 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
20320 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
20330 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
20340 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
20350 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
20360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
20370 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69  e(pPgHdr);.    i
20380 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20390 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
203a0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
203b0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
203c0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
203d0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
203e0 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
203f0 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  e_counter = sqli
20400 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38 2a  te3Get4byte((u8*
20410 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  )pPager->dbFileV
20420 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e 67 65  ers);.    change
20430 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
20440 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
20450 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
20460 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61  pPgHdr))+24, cha
20470 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20  nge_counter);.  
20480 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
20490 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
204a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50   */.    sqlite3P
204b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72  agerUnref(pPgHdr
204c0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  );.    pPager->c
204d0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
204e0 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
204f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20500 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
20510 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
20520 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
20530 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
20540 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
20550 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
20560 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
20570 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
20580 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
20590 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
205a0 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
205b0 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
205c0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
205d0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
205e0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
205f0 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
20600 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
20610 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
20620 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  es that the jour
20630 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61  nal is synced, a
20640 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77  ll dirty pages w
20650 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65  ritten.** to the
20660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
20670 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
20680 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65  file synced. The
20690 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74   only thing that
206a0 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63  .** remains to c
206b0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
206c0 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65  ction is to dele
206d0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
206e0 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65  ile (or.** maste
206f0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
20700 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
20710 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
20720 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
20730 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
20740 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
20750 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
20760 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
20770 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
20780 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
20790 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
207a0 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
207b0 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
207c0 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
207d0 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
207e0 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
207f0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
20800 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
20810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20820 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
20830 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
20840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
20850 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e  ster, Pgno nTrun
20860 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  c){.  int rc = S
20870 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47  QLITE_OK;..  PAG
20880 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41  ERTRACE4("DATABA
20890 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73  SE SYNC: File=%s
208a0 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75   zMaster=%s nTru
208b0 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  nc=%d\n", .     
208c0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
208d0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  me, zMaster, nTr
208e0 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  unc);..  /* If t
208f0 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
20900 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
20910 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
20920 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
20930 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
20940 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
20950 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
20960 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
20970 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
20980 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
20990 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
209a0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
209b0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
209c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
209d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
209e0 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  n );..    /* If 
209f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
20a00 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61   file name has a
20a10 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
20a20 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ten to the.    *
20a30 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  * journal file, 
20a40 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20  then no sync is 
20a50 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68  required. This h
20a60 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69  appens when it i
20a70 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  s.    ** written
20a80 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65  , then the proce
20a90 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72  ss fails to upgr
20aa0 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52  ade from a RESER
20ab0 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a  VED to an.    **
20ac0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
20ad0 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   The next time t
20ae0 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73  he process tries
20af0 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20   to commit the. 
20b00 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
20b10 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77  n the m-j name w
20b20 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79  ill have already
20b30 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20   been written.. 
20b40 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
20b50 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
20b60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
20b70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
20b80 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b  counter(pPager);
20b90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20ba0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20bb0 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64  sync_exit;.#ifnd
20bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
20be0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
20bf0 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
20c00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
20c10 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
20c20 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
20c30 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
20c40 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
20c50 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
20c60 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
20c70 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
20c80 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
20c90 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20    ** file..     
20ca0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
20cb0 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e  no i;.        in
20cc0 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f  t iSkip = PAGER_
20cd0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b  MJ_PGNO(pPager);
20ce0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
20cf0 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
20d00 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
20d10 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
20d20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
20d30 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
20d40 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26  & (1<<(i&7))) &&
20d50 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
20d60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
20d70 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
20d80 61 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a  ager, i, &pPg);.
20d90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
20da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
20db0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
20dc0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
20dd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20de0 74 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  te(pPg);.       
20df0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20e00 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
20e10 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
20e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20e30 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20e40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20e50 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   } .      }.#end
20e60 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  if.      rc = wr
20e70 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
20e80 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
20e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20eb0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20ec0 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72     rc = syncJour
20ed0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
20ee0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20ef0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
20f00 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  _exit;.    }..#i
20f10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20f20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20f30 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
20f40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20f50 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
20f60 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
20f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
20f90 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
20fa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
20fb0 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
20fc0 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
20fd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20fe0 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
20ff0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
21000 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
21010 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
21020 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
21030 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
21040 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
21050 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61  nc_exit;.    pPa
21060 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  ger->pDirty = 0;
21070 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
21080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21090 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
210a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
210b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
210c0 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
210d0 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  fd, 0);.    }.  
210e0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59    IOTRACE(("DBSY
210f0 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  NC %p\n", pPager
21100 29 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ))..    pPager->
21110 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59  state = PAGER_SY
21120 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NCED;.  }else if
21130 28 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e  ( MEMDB && nTrun
21140 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c!=0 ){.    rc =
21150 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
21160 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
21170 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63  runc);.  }..sync
21180 5f 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d  _exit:.  if( rc=
21190 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
211a0 4f 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20  OCKED ){.    /* 
211b0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
211c0 65 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61  ecounter() may a
211d0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
211e0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20   an exclusive.  
211f0 20 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69     * lock to spi
21200 6c 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64  ll the cache and
21210 20 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c   return IOERR_BL
21220 4f 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65  OCKED. But since
21230 20 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69   .     * there i
21240 73 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20  s no chance the 
21250 63 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69  cache is inconsi
21260 73 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20  stent, it's.    
21270 20 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74   * better to ret
21280 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
21290 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  .     */.    rc 
212a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
212b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
212c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  }.../*.** Commit
212d0 20 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20   all changes to 
212e0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64  the database and
212f0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
21300 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  te lock..**.** I
21310 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69  f the commit fai
21320 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
21330 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74  n, a rollback at
21340 74 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a  tempt is made.**
21350 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
21360 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
21370 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77   If the commit w
21380 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b  orked, SQLITE_OK
21390 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
213a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
213b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
213c0 77 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  wo(Pager *pPager
213d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
213e0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
213f0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
21400 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
21410 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
21420 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
21430 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
21440 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
21450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21460 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54  OR;.  }.  PAGERT
21470 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
21480 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21490 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
214a0 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
214b0 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
214c0 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
214d0 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
214e0 67 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  g ){.      PgHis
214f0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
21500 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
21510 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
21520 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
21530 73 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  st);.      pPg->
21540 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
21550 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
21560 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21570 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
21580 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
21590 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  c = 0;.      pHi
215a0 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
215b0 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
215c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
215d0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
215e0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
215f0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  >pDirty = 0;.#if
21600 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
21610 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
21620 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
21630 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
21640 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
21650 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
21660 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
21670 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
21680 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  ( !pPg->alwaysRo
21690 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
216a0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
216b0 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61  pOrig );.      a
216c0 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
216d0 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65  Stmt );.    }.#e
216e0 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d  ndif.    pPager-
216f0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
21700 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
21710 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
21720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21730 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
21740 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
21750 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
21760 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
21770 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21780 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
21790 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72  YNCED || !pPager
217a0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a  ->dirtyCache );.
217b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
217c0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
217d0 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
217e0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
217f0 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r, rc);.}../*.**
21800 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
21810 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
21820 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
21830 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
21840 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
21850 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
21860 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
21870 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
21880 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
21890 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
218a0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
218b0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
218c0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
218d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
218e0 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
218f0 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
21900 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
21910 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  or unless some o
21920 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
21930 69 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68  is writing trash
21940 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
21950 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43  l file (SQLITE_C
21960 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e  ORRUPT) or.** un
21970 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c  less a prior mal
21980 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51  loc() failed (SQ
21990 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70  LITE_NOMEM).  Ap
219a0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a  propriate error.
219b0 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74  ** codes are ret
219c0 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68  urned for all th
219d0 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20  ese occasions.  
219e0 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51  Otherwise,.** SQ
219f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21a00 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
21a10 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
21a20 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21a30 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47  .  int rc;.  PAG
21a40 45 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41  ERTRACE2("ROLLBA
21a50 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
21a60 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
21a70 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
21a80 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
21a90 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
21aa0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
21ab0 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
21ac0 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
21ad0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
21ae0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
21af0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
21b00 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
21b10 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
21b20 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
21b30 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
21b40 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
21b50 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
21b60 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
21b70 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
21b80 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
21b90 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21ba0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
21bb0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21bc0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
21bd0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
21be0 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
21bf0 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
21c00 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
21c10 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
21c20 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
21c30 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
21c40 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
21c50 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
21c60 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
21c70 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
21c80 73 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45  se{.        PAGE
21c90 52 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64  RTRACE3("PAGE %d
21ca0 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
21cb0 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
21cc0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
21cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
21ce0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
21cf0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
21d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
21d10 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
21d20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
21d30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69  t = 0;.      pHi
21d40 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  st->pPrevStmt = 
21d50 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
21d60 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
21d70 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
21d80 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
21d90 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
21da0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
21db0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
21dc0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
21dd0 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  Dirty = 0;.    p
21de0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
21df0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
21e00 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f  Size = pPager->o
21e10 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70  rigDbSize;.    p
21e20 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
21e30 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
21e40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
21e50 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  se = 0;.    pPag
21e60 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
21e70 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
21e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21e90 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
21ea0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c  er->dirtyCache |
21eb0 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  | !pPager->journ
21ec0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  alOpen ){.    rc
21ed0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
21ee0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
21ef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
21f00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
21f10 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70  er->errCode && p
21f20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d  Pager->errCode!=
21f30 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20  SQLITE_FULL ){. 
21f40 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
21f50 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
21f60 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
21f70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
21f80 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ager, 0);.    }.
21f90 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
21fa0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
21fb0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21fc0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
21fd0 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
21fe0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
21ff0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
22000 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20  er, 0);.    rc2 
22010 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
22020 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
22030 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22050 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
22060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
22070 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
22080 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d  (pPager, 0);.  }
22090 0a 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65  .  /* pager_rese
220a0 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  t(pPager); */.  
220b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
220c0 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e   -1;..  /* If an
220d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
220e0 72 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c  ring a ROLLBACK,
220f0 20 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65   we can no longe
22100 72 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65  r trust the page
22110 72 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f  r.  ** cache. So
22120 20 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f   call pager_erro
22130 72 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f  r() on the way o
22140 75 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65  ut to make any e
22150 72 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69  rror .  ** persi
22160 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65  stent..  */.  re
22170 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
22180 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
22190 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
221a0 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61  UE if the databa
221b0 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  se file is opene
221c0 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65  d read-only.  Re
221d0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
221e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
221f0 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69   (in theory) wri
22200 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
22210 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
22220 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
22230 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
22240 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
22250 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
22260 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
22270 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
22280 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
22290 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
222a0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
222b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
222c0 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66  er->nRef;.}..#if
222d0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
222e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
222f0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
22300 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
22310 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
22320 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
22330 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
22340 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
22350 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
22360 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20   pPager->nRef;. 
22370 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[1] = pPager->
22380 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20  nPage;.  a[2] = 
22390 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a  pPager->mxPage;.
223a0 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
223b0 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20  >dbSize;.  a[4] 
223c0 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
223d0 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
223e0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
223f0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
22400 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
22410 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
22420 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
22430 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
22440 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
22450 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
22460 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
22470 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
22480 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
22490 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
224a0 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
224b0 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
224c0 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
224d0 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
224e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
224f0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
22500 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
22510 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
22520 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
22530 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
22540 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
22550 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
22560 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
22570 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
22580 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
22590 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
225a0 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
225b0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
225c0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
225d0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
225e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
225f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
22600 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
22610 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
22620 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
22630 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
22640 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
22650 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
22660 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
22670 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
22680 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
22690 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
226a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
226b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
226c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
226d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
226e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
226f0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
22700 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22710 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
22720 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
22730 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
22740 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
22750 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
22760 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
22770 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
22780 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
22790 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
227a0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
227b0 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
227c0 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
227d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
227e0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
227f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
22800 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
22810 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
22820 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
22830 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
22840 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
22850 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
22860 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
22870 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
22880 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
22890 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
228a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
228b0 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
228c0 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
228d0 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
228e0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
228f0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
22900 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
22910 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
22920 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
22930 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
22940 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
22950 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73  ntemp(&pPager->s
22960 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
22970 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
22980 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
22990 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
229a0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
229b0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
229c0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
229d0 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
229e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
229f0 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
22a00 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
22a10 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
22a20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
22a30 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
22a40 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
22a50 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
22a60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22a70 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
22a80 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
22a90 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
22aa0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
22ab0 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
22ac0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
22ad0 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
22ae0 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52  pNext;.    PAGER
22af0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
22b00 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
22b10 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
22b20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
22b30 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
22b40 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
22b50 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
22b60 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
22b70 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
22b80 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
22b90 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
22ba0 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
22bb0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
22bc0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
22bd0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
22be0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
22bf0 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
22c00 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
22c10 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
22c20 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
22c30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
22c40 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
22c50 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
22c60 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
22c70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
22c80 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
22c90 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
22ca0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
22cb0 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
22cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
22cd0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
22ce0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
22cf0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
22d00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22d10 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
22d20 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
22d30 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
22d40 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
22d50 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
22d60 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
22d70 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
22d80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22d90 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
22da0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
22db0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22dc0 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
22dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
22de0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61  nt rc;.  if( pPa
22df0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
22e00 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
22e10 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
22e20 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
22e30 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
22e40 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
22e50 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
22e60 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
22e70 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  ist;.      for(p
22e80 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
22e90 3b 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74  ; pPg; pPg=pHist
22ea0 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
22eb0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
22ec0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
22ed0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
22ee0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
22ef0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
22f00 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
22f10 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74  DATA(pPg), pHist
22f20 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d  ->pStmt, pPager-
22f30 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
22f40 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
22f50 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
22f60 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
22f70 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
22f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
22f90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
22fa0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
22fb0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67  tSize;.      pag
22fc0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
22fd0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
22fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22ff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23000 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
23010 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
23020 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
23030 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
23040 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
23050 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
23060 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23070 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
23080 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
23090 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
230a0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
230b0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
230c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
230d0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
230e0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
230f0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
23100 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
23110 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
23120 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23130 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
23140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23150 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
23160 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
23170 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
23180 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
23190 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
231a0 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
231b0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
231c0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
231d0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
231e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
231f0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
23200 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23210 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
23220 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
23230 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23240 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
23250 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
23260 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
23270 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
23280 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
23290 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
232a0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
232b0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
232c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
232d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
232e0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
232f0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
23300 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
23310 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
23320 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
23330 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
23340 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
23350 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
23360 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
23370 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
23380 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
23390 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
233a0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
233b0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
233c0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
233d0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
233e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
233f0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
23400 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
23410 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
23420 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a  in the file. .**
23430 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
23440 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
23450 74 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76  to the page prev
23460 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
23470 74 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68  t.** pgno (which
23480 20 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29   we call pPgOld)
23490 20 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67   though that pag
234a0 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
234b0 62 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20  be.** in cache. 
234c0 20 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65   If the page pre
234d0 76 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74  vious located at
234e0 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
234f0 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72  eady.** in the r
23500 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
23510 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74   it is not put t
23520 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20  here by by this 
23530 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
23540 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
23550 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e   page pPg remain
23560 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
23570 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
23580 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
23590 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61  h pPg (i.e. data
235a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
235b0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
235c0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
235d0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
235e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
235f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
23600 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
23610 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
23620 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
23630 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
23640 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
23650 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
23660 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
23670 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
23680 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
23690 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
236a0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
236b0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
236c0 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
236d0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
236e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
236f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
23700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23710 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
23720 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
23730 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
23740 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
23750 50 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70  PgOld;  /* The p
23760 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72  age being overwr
23770 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20  itten. */.  int 
23780 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
23790 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
237a0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
237b0 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52  >0 );..  PAGERTR
237c0 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE5("MOVE %d pa
237d0 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
237e0 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
237f0 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
23800 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23810 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
23820 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49  Sync, pgno);.  I
23830 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70  OTRACE(("MOVE %p
23840 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %d %d\n", pPage
23850 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67  r, pPg->pgno, pg
23860 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65  no))..  pager_ge
23870 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
23880 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
23890 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  ync ){.    needS
238a0 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
238b0 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
238c0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
238d0 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61  || (int)pgno>pPa
238e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
238f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
23900 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  Pg->dirty );.   
23910 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23920 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
23930 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50  ..  /* Unlink pP
23940 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
23950 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
23960 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
23970 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
23980 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
23990 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
239a0 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
239b0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
239c0 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  ** from it's has
239d0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
239e0 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
239f0 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
23a00 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
23a10 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
23a20 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
23a30 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
23a40 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
23a50 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
23a60 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
23a70 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
23a80 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
23a90 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
23aa0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
23ab0 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
23ac0 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
23ad0 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
23ae0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
23af0 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
23b00 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
23b10 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  ;.    pPg->needS
23b20 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65  ync = pPgOld->ne
23b30 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b  edSync;.  }else{
23b40 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
23b50 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  nc = 0;.  }.  if
23b60 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
23b70 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
23b80 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
23b90 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67  bSize ){.    pPg
23ba0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28  ->inJournal =  (
23bb0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
23bc0 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
23bd0 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
23be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67    }else{.    pPg
23bf0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
23c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
23c10 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c  ->needSync==0 ||
23c20 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
23c30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
23c40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
23c50 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
23c60 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
23c70 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
23c80 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
23c90 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67   */.  assert( pg
23ca0 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e  no!=0 );.  pPg->
23cb0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
23cc0 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65   = pgno & (pPage
23cd0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69  r->nHash-1);.  i
23ce0 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
23cf0 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
23d00 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
23d10 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
23d20 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
23d30 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
23d40 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
23d50 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
23d60 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
23d70 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
23d80 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
23d90 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
23da0 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74  = 0;..  makeDirt
23db0 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72  y(pPg);.  pPager
23dc0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
23dd0 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
23de0 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
23df0 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
23e00 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
23e10 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
23e20 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
23e30 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
23e40 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
23e50 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
23e60 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
23e70 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
23e80 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
23e90 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
23ea0 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
23eb0 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
23ec0 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
23ed0 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
23ee0 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
23ef0 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
23f00 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
23f10 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
23f20 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
23f30 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
23f40 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
23f50 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
23f60 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
23f70 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
23f80 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
23f90 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
23fa0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
23fb0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
23fc0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
23fd0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
23fe0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
23ff0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
24000 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24010 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
24020 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24030 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24040 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
24050 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
24060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
24070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
24080 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
24090 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
240a0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
240b0 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75     pPgHdr->inJou
240c0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61  rnal = 1;.    ma
240d0 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
240e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
240f0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
24100 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
24110 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
24120 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
24130 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
24140 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70   data for the sp
24150 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
24160 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
24170 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67  gerGetData(DbPag
24180 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
24190 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
241a0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
241b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
241c0 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78  to the Pager.nEx
241d0 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78  tra bytes of "ex
241e0 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61  tra" space .** a
241f0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
24200 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
24210 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20  d page..*/.void 
24220 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  *sqlite3PagerGet
24230 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50  Extra(DbPage *pP
24240 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
24250 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
24260 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61  r;.  return (pPa
24270 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54  ger?PGHDR_TO_EXT
24280 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a  RA(pPg, pPager):
24290 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  0);.}../*.** Get
242a0 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67  /set the locking
242b0 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70  -mode for this p
242c0 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20  ager. Parameter 
242d0 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e  eMode must be on
242e0 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f  e.** of PAGER_LO
242f0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c  CKINGMODE_QUERY,
24300 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
24310 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a  DE_NORMAL or .**
24320 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
24330 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66  DE_EXCLUSIVE. If
24340 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69   the parameter i
24350 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68  s not _QUERY, th
24360 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e  en.** the lockin
24370 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f  g-mode is set to
24380 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69   the value speci
24390 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fied..**.** The 
243a0 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69  returned value i
243b0 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c  s either PAGER_L
243c0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
243d0 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f  L or.** PAGER_LO
243e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
243f0 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IVE, indicating 
24400 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
24410 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
24420 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a  * locking-mode..
24430 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
24440 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50  gerLockingMode(P
24450 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
24460 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
24470 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
24480 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45  _LOCKINGMODE_QUE
24490 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
244a0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
244b0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
244c0 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  L.            ||
244d0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
244e0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
244f0 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IVE );.  assert(
24500 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f   PAGER_LOCKINGMO
24510 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20  DE_QUERY<0 );.  
24520 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
24530 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
24540 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43  >=0 && PAGER_LOC
24550 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
24560 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65  VE>=0 );.  if( e
24570 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67  Mode>=0 && !pPag
24580 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
24590 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c      pPager->excl
245a0 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64  usiveMode = eMod
245b0 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
245c0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63  (int)pPager->exc
245d0 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23  lusiveMode;.}..#
245e0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
245f0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
24600 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
24610 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
24620 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
24630 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b  of the file lock
24640 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
24650 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74  ager..** The ret
24660 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65  urn value is one
24670 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41   of NO_LOCK, SHA
24680 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56  RED_LOCK, RESERV
24690 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44  ED_LOCK,.** PEND
246a0 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43  ING_LOCK, or EXC
246b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a  LUSIVE_LOCK..*/.
246c0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
246d0 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  Lockstate(Pager 
246e0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
246f0 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  rn sqlite3OsLock
24700 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  State(pPager->fd
24710 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
24720 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
24730 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
24740 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
24750 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
24760 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
24770 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
24780 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
24790 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
247a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
247b0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
247c0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
247d0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
247e0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
247f0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
24800 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
24810 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
24820 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
24830 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
24840 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
24850 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
24860 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
24870 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
24880 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
24890 49 4f 20 2a 2f 0a                                IO */.