/ Hex Artifact Content
Login

Artifact a8e5c2fd00737ddd7d8c8416d0fdbbf904d78b64:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 34  : pager.c,v 1.34
0350: 35 20 32 30 30 37 2f 30 36 2f 31 36 20 30 34 3a  5 2007/06/16 04:
0360: 34 32 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a  42:12 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2fa0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2fb0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2ff0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
3000: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
3010: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3030: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3040: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
3050: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a  tabase */.  u8 *
3060: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
3070: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3080: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3090: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30a0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
30b0: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
30c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
30d0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
30e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3100: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3110: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3120: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3130: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3140: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
3150: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
3160: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3170: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
3180: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3190: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
31a0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
31b0: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
31c0: 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  File *fd, *jfd; 
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
31e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
31f0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
3200: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
3210: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3230: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
3240: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3250: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
3260: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
3270: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
3280: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
3290: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67  yHandler */.  Pg
32a0: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
32b0: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
32c0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
32d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
32e0: 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  stSynced;       
32f0: 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70   /* First free p
3300: 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e  age with PgHdr.n
3310: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20  eedSync==0 */.  
3320: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3340: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
3350: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
3360: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
3370: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
3380: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
3390: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
33a0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
33b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
33c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
33d0: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
33e0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3400: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
3410: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
3420: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
3430: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
3440: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
3450: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
3460: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
3470: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
3480: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
3490: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
34a0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
34b0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
34c0: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
34d0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
34e0: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
34f0: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
3500: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
3510: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
3520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3530: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
3540: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3550: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
3560: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3570: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3580: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3590: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
35a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
35b0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
35c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
35d0: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
35e0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
35f0: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
3600: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3610: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
3620: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
3630: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
3640: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
3650: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3660: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
3670: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
3680: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
3690: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
36a0: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
36b0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
36c0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
36d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
36e0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
36f0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
3700: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
3710: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
3720: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
3730: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
3740: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
3750: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
3760: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
3770: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
3780: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
3790: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
37a0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
37b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
37c0: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
37d0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
37e0: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
37f0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
3800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
3810: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3820: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3830: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
3840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
3850: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
3860: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
3870: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
3880: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
38a0: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
38b0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
38c0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
38d0: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
38f0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
3900: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
3910: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
3920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
3930: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
3940: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
3950: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
3960: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
3970: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
3980: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
3990: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
39a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
39b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
39c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
39d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
39e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
39f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
3a00: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
3a10: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
3a20: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
3a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a40: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
3a50: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
3a60: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
3a70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
3a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a90: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
3aa0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
3ac0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
3ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3ae0: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
3af0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3b00: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
3b10: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
3b20: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3b30: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
3b40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
3b50: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
3b60: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
3b70: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
3b80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
3b90: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
3ba0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
3bb0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
3bc0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
3bd0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
3be0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
3bf0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
3c00: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
3c10: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
3c20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
3c30: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
3c40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
3c50: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
3c60: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
3c70: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
3c80: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
3c90: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
3ca0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
3cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
3cc0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
3cd0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
3ce0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
3cf0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
3d00: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
3d10: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
3d20: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
3d30: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
3d40: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
3d50: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
3d60: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
3d70: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
3d80: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
3d90: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
3da0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
3db0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
3dd0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
3de0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
3df0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
3e00: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
3e10: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
3e20: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
3e30: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
3e40: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
3e50: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
3e60: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
3e70: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
3e80: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
3e90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
3ea0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
3eb0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
3ec0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
3ed0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
3ee0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
3ef0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
3f00: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
3f10: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
3f20: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
3f30: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
3f40: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
3f50: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
3f60: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
3f70: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
3f80: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
3f90: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
3fa0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
3fb0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
3fc0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
3fd0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
3fe0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
3ff0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
4000: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
4010: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4020: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
4030: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
4040: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
4050: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
4060: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
4070: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4080: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
40a0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
40b0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
40c0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
40d0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
40e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
40f0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
4100: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
4110: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
4120: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
4130: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
4140: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4150: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
4160: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4170: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4180: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4190: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
41a0: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
41b0: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
41c0: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
41d0: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
41e0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
41f0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
4200: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
4210: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
4220: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
4230: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
4240: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
4250: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
4260: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
4270: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
4280: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
4290: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
42a0: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
42b0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
42c0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
42d0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
42e0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
42f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
4300: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
4310: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
4320: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
4330: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
4340: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
4350: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
4360: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
4370: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
4380: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
4390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
43a0: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
43b0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
43c0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
43d0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
43e0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43f0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
4400: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
4410: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
4420: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
4430: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4440: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4450: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4460: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4470: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4480: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4490: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
44a0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
44b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
44c0: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
44d0: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
4500: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
4510: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
4520: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
4530: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4540: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4550: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4560: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4570: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4580: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4590: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
45a0: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
45b0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
45c0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
45d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
4600: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
4610: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
4620: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
4630: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4640: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4650: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4660: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4670: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4680: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4690: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
46a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
46b0: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
46c0: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
46d0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46e0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46f0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
4700: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
4710: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
4720: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
4730: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4740: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
4750: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
4760: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
4770: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
4780: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
4790: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
47a0: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
47b0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
47c0: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
47d0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
47e0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
47f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4800: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
4810: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
4820: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
4830: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
4840: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
4850: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
4860: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
4870: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
4880: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
4890: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
48a0: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
48b0: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
48c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
48d0: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
48e0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
48f0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4900: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
4910: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
4920: 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  n PGHDR_TO_HIST(
4930: 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e  pPg, pPager)->in
4940: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
4950: 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
4960: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38  Pg->pgno;.    u8
4970: 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49   *a = pPager->aI
4980: 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72  nStmt;.    retur
4990: 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e  n (a && (int)pgn
49a0: 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
49b0: 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38  ize && (a[pgno/8
49c0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
49d0: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  )));.  }.}../*.*
49e0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
49f0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4a00: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
4a10: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
4a20: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
4a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
4a40: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
4a50: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
4a60: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
4a70: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
4a80: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
4a90: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
4aa0: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
4ab0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4ac0: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
4ad0: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
4ae0: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
4af0: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
4b00: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
4b10: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
4b20: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
4b30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
4b50: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
4b60: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
4b70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
4b80: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72  h = aHash;.  for
4b90: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4ba0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4bb0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4bc0: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
4bd0: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
4be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
4bf0: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
4c00: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
4c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4c30: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
4c40: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
4c50: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
4c60: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
4c70: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
4c80: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
4c90: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
4ca0: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
4cb0: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
4cc0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
4cd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
4ce0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4cf0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4d00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4d20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4d30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4d50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4d60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4d70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4d80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4d90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4da0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4db0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4dc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4dd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
4de0: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
4df0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4e00: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4e10: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4e20: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4e30: 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66  izeof(ac));.  if
4e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4e50: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
4e60: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
4e70: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
4e80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4e90: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4ea0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
4eb0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
4ec0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
4ed0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
4ee0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
4ef0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
4f00: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
4f10: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4f20: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4f30: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4f40: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4f50: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4f60: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4f70: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4f80: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4fa0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4fb0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4fc0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4fd0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4fe0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4ff0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
5000: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
5010: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
5020: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
5030: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
5040: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
5050: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
5060: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
5070: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
5080: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
5090: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
50a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
50b0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
50c0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
50d0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
50e0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
50f0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5100: 28 61 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  (ac);.}.../*.** 
5110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
5120: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
5130: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hen an error occ
5140: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  urs within the p
5150: 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ager.** code. Th
5160: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5170: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
5180: 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
5190: 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63  ture, the.** sec
51a0: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
51b0: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
51c0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
51d0: 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
51e0: 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72   .** The value r
51f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
5200: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
5210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
5220: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
5230: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
5240: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
5250: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
5260: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
5270: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
5280: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
5290: 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75  rsistent. All su
52a0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
52b0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
52c0: 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  .** will immedia
52d0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
52e0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  same error code.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5300: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
5310: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
5320: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
5330: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
5340: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
5350: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
5360: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
5370: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
5380: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
5390: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
53a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53b0: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
53c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
53d0: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
53e0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
53f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
5410: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
5420: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
5430: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
5440: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
5450: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
5460: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
5470: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5480: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
5490: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
54a0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
54b0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
54c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
54d0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
54e0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
54f0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
5500: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
5510: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
5530: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
5540: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
5550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
5560: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
5570: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
5580: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
5590: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
55a0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
55b0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
55c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
55d0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
55e0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
55f0: 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20 20  >pageSize, .    
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68      (unsigned ch
5620: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5630: 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  TA(pPage));.}../
5640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
5650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
5660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
5670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
5680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
5690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
56a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
56b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
56c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
56d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
56e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
56f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
5700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
5710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
5720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
5730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
5740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
5750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
5760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
5790: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
57a0: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
57b0: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c  rCode || MEMDB |
57c0: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
57d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
57e0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
57f0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
5800: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
5810: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 29 20  ger_datahash(X) 
5820: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5830: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5840: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5850: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
5860: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5870: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5880: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5890: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
58a0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
58b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
58c0: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
58d0: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
58e0: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
58f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5900: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
5910: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
5920: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
5930: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
5940: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
5950: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
5960: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5970: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5980: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5990: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
59a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
59b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
59c0: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
59d0: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
59e0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
59f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a00: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5a10: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
5a20: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
5a30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
5a40: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5a50: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5a60: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5a70: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5a80: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5a90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5aa0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5ab0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5ac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5ad0: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5ae0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5af0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5b00: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
5b10: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5b20: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
5b30: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
5b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5b50: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
5b60: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5b70: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5b80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5ba0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5bb0: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5bc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5bd0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5bf0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5c00: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
5c10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
5c20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
5c30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
5c40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5c50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
5c60: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5c70: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5c80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5c90: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5ca0: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5cb0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5cc0: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5cd0: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5ce0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5cf0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5d00: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
5d10: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
5d20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5d30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5d40: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5d50: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5d60: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5d70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5d80: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5d90: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5da0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5db0: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5dc0: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5dd0: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5de0: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5df0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5e00: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
5e10: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
5e20: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
5e30: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
5e40: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
5e50: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
5e60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e70: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5e80: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5e90: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5ea0: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5eb0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5ec0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5ed0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5ee0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5ef0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5f00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5f10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5f20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5f40: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5f50: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5f80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5f90: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5fa0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5fb0: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5fc0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5fd0: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5fe0: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5ff0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
6000: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
6010: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
6020: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
6030: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6040: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
6050: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
6060: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
6070: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
60a0: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
60c0: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
60e0: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
6100: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
6120: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
6130: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
6140: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6150: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
6160: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
6170: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6180: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
6190: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
61a0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
61b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
61c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61d0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
61e0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
61f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6200: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
6210: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
6220: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
6230: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
6240: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
6250: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6260: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
6270: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6280: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6290: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
62a0: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
62b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
62c0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
62d0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
62e0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
62f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
6300: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6310: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
6320: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
6330: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
6340: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
6350: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
6360: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
6370: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
6380: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6390: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
63a0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
63b0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
63c0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
63d0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
63e0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
63f0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
6400: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6410: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
6420: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
6430: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6440: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
6450: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6460: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6470: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6480: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6490: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
64a0: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
64b0: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
64c0: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
64d0: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
64e0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
64f0: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6500: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
6510: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
6520: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6530: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
6540: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
6550: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
6560: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6570: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6580: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6590: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
65a0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
65b0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
65c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
65d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
65e0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
65f0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6600: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6610: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6620: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
6630: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
6640: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
6650: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
6660: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6670: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6680: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6690: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
66a0: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
66b0: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
66c0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
66d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
66e0: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
66f0: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6700: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
6710: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
6720: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
6730: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
6740: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
6750: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
6760: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6770: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6780: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6790: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
67a0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
67b0: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
67c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
67d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
67e0: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
67f0: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6800: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
6810: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
6820: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
6830: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6840: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6850: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6860: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6870: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6880: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6890: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
68a0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
68b0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
68c0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
68d0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
68e0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
68f0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6900: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6910: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6920: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6930: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6940: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
6950: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6960: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6970: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6980: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6990: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
69a0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
69b0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
69c0: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
69d0: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
69e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
69f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6a00: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
6a10: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
6a20: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
6a30: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
6a40: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
6a50: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
6a60: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6a70: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6a80: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6a90: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6aa0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6ac0: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6ad0: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6ae0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6af0: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6b10: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6b20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6b30: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
6b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6b50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6b60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6b70: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6b90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6ba0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6bb0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6bc0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6bd0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6be0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6bf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6c00: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
6c10: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
6c20: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
6c30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
6c40: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
6c50: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
6c60: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6c70: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6c80: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6c90: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6ca0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6cb0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6cc0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6cd0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6ce0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6cf0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6d00: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
6d10: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
6d20: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
6d30: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
6d40: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
6d50: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
6d60: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6d70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6d80: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6da0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6db0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6dc0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6dd0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6de0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6df0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6e00: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
6e10: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
6e20: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
6e30: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
6e40: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
6e50: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
6e60: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6e70: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6e80: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6e90: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6ea0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6ec0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6ed0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6ee0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6ef0: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6f00: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6f10: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6f20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6f30: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6f40: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6f50: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6f60: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6f70: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6f80: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6f90: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6fa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6fb0: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6fc0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6fd0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6ff0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
7000: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
7010: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
7020: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7030: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7040: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
7050: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
7060: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7070: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
7080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7090: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
70a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
70b0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
70c0: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
70d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
70e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
70f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
7100: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7110: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7120: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7130: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7140: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
7150: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7160: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
7170: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
7180: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
7190: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
71a0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
71b0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
71c0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
71d0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
71e0: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
71f0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
7200: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
7210: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
7220: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
7230: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7240: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7250: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7260: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
7270: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
7280: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
7290: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
72a0: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
72b0: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
72c0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
72d0: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
72e0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
72f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7300: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
7310: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
7320: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7330: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
7340: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
7350: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
7360: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
7370: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7380: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
7390: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
73a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
73b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
73c0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
73d0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
73e0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
73f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7400: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
7410: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
7420: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
7430: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
7440: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
7450: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
7460: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7480: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7490: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
74a0: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
74b0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
74c0: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
74d0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
74e0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
74f0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7500: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
7510: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
7520: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
7530: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
7540: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7550: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
7560: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7570: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7580: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7590: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
75a0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
75b0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
75c0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
75d0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
75e0: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
75f0: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7600: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
7610: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
7620: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
7630: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
7640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7650: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
7660: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7670: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7680: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7690: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
76a0: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
76b0: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
76c0: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
76d0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
76e0: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
76f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7700: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
7710: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
7720: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
7730: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
7740: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
7750: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
7760: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7770: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7780: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7790: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
77a0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
77b0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
77c0: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
77d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
77e0: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
77f0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7800: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
7810: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
7820: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
7830: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
7840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
7850: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
7860: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7870: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7880: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7890: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
78a0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
78b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
78c0: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
78d0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
78e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
78f0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7900: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7910: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7920: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
7930: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
7940: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
7950: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
7960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7970: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7980: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7990: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
79a0: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
79b0: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
79c0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
79d0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
79e0: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
79f0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7a00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
7a10: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
7a20: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
7a30: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
7a40: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
7a50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7a60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7a70: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7a80: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7a90: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7aa0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7ab0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7ac0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7ad0: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7ae0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7af0: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7b00: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
7b10: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
7b20: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
7b30: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
7b40: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
7b50: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
7b60: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7b70: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7b80: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7b90: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7ba0: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7bb0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7bc0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7bd0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7be0: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7bf0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7c00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7c10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
7c20: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
7c30: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7c40: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
7c50: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
7c60: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
7c70: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7c80: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
7c90: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
7ca0: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
7cb0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7cc0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
7cd0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7ce0: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
7cf0: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
7d00: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7d10: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
7d20: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
7d30: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
7d40: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
7d50: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
7d60: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
7d70: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7d80: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7d90: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7da0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7db0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7dc0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7dd0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7de0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7df0: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7e00: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7e10: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7e20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7e30: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
7e40: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
7e50: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
7e60: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
7e70: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7e80: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7e90: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7ea0: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7ec0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7ed0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7ee0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7ef0: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
7f00: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
7f10: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
7f20: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
7f30: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
7f40: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7f50: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7f60: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
7f70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7f80: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
7f90: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
7fa0: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
7fb0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7fc0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7fd0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
7fe0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
7ff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
8000: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
8010: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
8020: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
8030: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
8040: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
8050: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
8060: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
8070: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
8080: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
8090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
80a0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
80b0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
80c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
80d0: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
80e0: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
80f0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8100: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
8110: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
8120: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
8130: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
8140: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
8150: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
8160: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
8170: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
8180: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
8190: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
81a0: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
81b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
81c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
81d0: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
81e0: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
81f0: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
8200: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8210: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
8220: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
8230: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
8240: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
8250: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
8260: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
8270: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
8280: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
8290: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
82a0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
82b0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
82c0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
82d0: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
82e0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
82f0: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
8300: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
8310: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
8320: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
8330: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
8340: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8360: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
8370: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
8380: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
8390: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
83a0: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
83b0: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
83c0: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
83d0: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
83e0: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
83f0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
8400: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
8410: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
8420: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
8430: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
8440: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8450: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
8460: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
8470: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
8480: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
8490: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
84a0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
84b0: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
84c0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
84d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
84e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
84f0: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
8500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
8510: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
8520: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
8530: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
8540: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
8550: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
8560: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
8570: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
8580: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
8590: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
85a0: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
85b0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
85c0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
85d0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
85e0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
85f0: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
8600: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
8610: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
8620: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
8630: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
8640: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8650: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
8660: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
8670: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
8680: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
8690: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
86a0: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
86b0: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
86c0: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
86d0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
86e0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
86f0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
8700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
8710: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
8720: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
8730: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
8740: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
8750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8760: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8770: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8780: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
8790: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
87a0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
87b0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
87c0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
87d0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
87e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
87f0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
8800: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
8810: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
8820: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
8830: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8840: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
8850: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
8860: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
8870: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
8880: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
88a0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
88b0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
88c0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
88d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
88e0: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
88f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8900: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8910: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
8920: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
8930: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
8940: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8950: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8960: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
8970: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
8980: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
8990: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
89a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
89b0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
89c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
89d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
89e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
89f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8a00: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8a10: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8a20: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8a40: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
8a50: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8a60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8a70: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8a80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a90: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8aa0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
8ab0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
8ac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ad0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
8ae0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
8af0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8b00: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8b10: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
8b20: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8b30: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8b40: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8b50: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8b60: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8b70: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8b80: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
8b90: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
8ba0: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
8bb0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8bc0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
8bd0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
8be0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8bf0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8c00: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
8c10: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8c20: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8c30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8c40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8c60: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8c70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8c80: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8c90: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
8ca0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
8cb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
8cc0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8cd0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
8ce0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8cf0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
8d00: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
8d10: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8d20: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8d30: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8d40: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8d50: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8d60: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8d70: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8d80: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8d90: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8da0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8db0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8dc0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8dd0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8de0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
8df0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
8e00: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
8e10: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8e20: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
8e30: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8e40: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8e50: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8e60: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8e70: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8e80: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8e90: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8ea0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8eb0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8ec0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8ed0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8ee0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8ef0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8f00: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8f10: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8f20: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8f30: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8f40: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8f50: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8f60: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8f70: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8f80: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8f90: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8fa0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8fb0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8fc0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8fd0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8fe0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8ff0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
9000: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
9010: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
9020: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
9030: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
9040: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
9050: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
9060: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9070: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
9080: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
9090: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
90a0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
90b0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
90c0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
90d0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
90e0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
90f0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
9100: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
9110: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
9120: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
9130: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
9140: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
9150: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
9160: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9170: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
9180: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
9190: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
91a0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
91b0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
91c0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
91d0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
91e0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
91f0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
9200: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
9210: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
9220: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
9230: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
9240: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
9250: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
9260: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
9270: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
9280: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
9290: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
92a0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
92b0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
92c0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
92d0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
92e0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
92f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9300: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
9310: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
9320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9330: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9350: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9370: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9380: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
9390: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
93a0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
93b0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
93c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
93d0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
93e0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
93f0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
9400: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
9410: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
9420: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
9430: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
9440: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
9450: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
9460: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
9470: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
9480: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
9490: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
94a0: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
94b0: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
94c0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
94f0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9500: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9530: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9540: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9550: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9570: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9580: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
9590: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
95a0: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
95b0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
95c0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
95d0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
95e0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
95f0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
9600: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9610: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
9620: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9630: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
9640: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
9650: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
9660: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
9670: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
9680: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
9690: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
96a0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
96b0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
96c0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
96d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
96e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
96f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9700: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
9710: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9720: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9730: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9740: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9750: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9760: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9770: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9780: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
9790: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
97a0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
97b0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
97c0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
97d0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
97e0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
97f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9800: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9810: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9820: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9830: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9840: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9850: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9860: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9870: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9880: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
9890: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
98a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
98b0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
98c0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
98d0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
98e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
98f0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9900: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9910: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9920: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9930: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9940: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9950: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9960: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9970: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9980: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9990: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
99a0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
99b0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
99c0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
99d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
99e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
99f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a00: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
9a10: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
9a20: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9a30: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9a40: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9a50: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9a60: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9a70: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9a80: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
9a90: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9aa0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
9ab0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
9ac0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
9ad0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
9ae0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
9af0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
9b00: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
9b10: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
9b20: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
9b30: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
9b40: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
9b50: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
9b60: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
9b70: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
9b80: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
9b90: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
9ba0: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
9bb0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
9bc0: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
9bd0: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
9be0: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
9bf0: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
9c00: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
9c10: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
9c20: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
9c30: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
9c40: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
9c50: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
9c60: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
9c70: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
9c80: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
9c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
9ca0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
9cb0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
9cc0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9cd0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
9ce0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
9cf0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9d00: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
9d10: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
9d20: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
9d30: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
9d40: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
9d50: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
9d60: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
9d70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
9d80: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
9d90: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9db0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
9dc0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
9dd0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
9de0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
9df0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9e00: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
9e10: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
9e20: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
9e30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
9e40: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
9e50: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
9e60: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
9e70: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
9e80: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
9e90: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
9ea0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
9eb0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
9ec0: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
9ed0: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
9ee0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
9ef0: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
9f00: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
9f10: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
9f20: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
9f30: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
9f40: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
9f50: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
9f60: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
9f70: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
9f80: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
9f90: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
9fa0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
9fb0: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
9fc0: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
9fd0: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
9fe0: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9ff0: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
a000: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
a010: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
a020: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
a030: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
a040: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
a050: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
a060: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
a070: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
a080: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
a090: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
a0a0: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
a0b0: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
a0c0: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
a0d0: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
a0e0: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
a0f0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
a100: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
a110: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
a120: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
a130: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
a140: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
a150: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
a160: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
a170: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
a180: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
a190: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
a1a0: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ) ){.    rc = sq
a1b0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
a1c0: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
a1d0: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
a1e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
a1f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a200: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
a210: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
a220: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
a230: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
a240: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a250: 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d 61 6b  pPg ){.      mak
a260: 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
a270: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67   }.  }.  if( pPg
a280: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61   ){.    /* No pa
a290: 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62  ge should ever b
a2a0: 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c  e explicitly rol
a2b0: 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73  led back that is
a2c0: 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a   in use, except.
a2d0: 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20      ** for page 
a2e0: 31 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20  1 which is held 
a2f0: 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20  in use in order 
a300: 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b  to keep the lock
a310: 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
a320: 61 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20  atabase active. 
a330: 48 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70  However such a p
a340: 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65  age may be rolle
a350: 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
a360: 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20  lt.    ** of an 
a370: 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72  internal error r
a380: 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61  esulting in an a
a390: 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f  utomatic call to
a3a0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  .    ** sqlite3P
a3b0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 2e 0a  agerRollback()..
a3c0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
a3d0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
a3e0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
a3f0: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
a400: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
a410: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
a420: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
a430: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
a440: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
a450: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
a460: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a470: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
a480: 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67 2c 20  >xReiniter(pPg, 
a490: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a4a0: 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  );.    }.#ifdef 
a4b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a4c0: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
a4d0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
a4e0: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
a4f0: 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  if.    /* If thi
a500: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a510: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a520: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62  alue of Pager.db
a530: 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20 2a 2a  FileVers..    **
a540: 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   Do this before 
a550: 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20 2a 2f  any decoding. */
a560: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31  .    if( pgno==1
a570: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
a580: 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
a590: 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70 44 61  Vers, &((u8*)pDa
a5a0: 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66 28 70  ta)[24],sizeof(p
a5b0: 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
a5c0: 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s));.    }..    
a5d0: 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 61  /* Decode the pa
a5e0: 67 65 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f  ge just read fro
a5f0: 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20 43 4f  m disk */.    CO
a600: 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61  DEC1(pPager, pDa
a610: 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  ta, pPg->pgno, 3
a620: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a630: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  rc;.}../*.** Par
a640: 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69  ameter zMaster i
a650: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
a660: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a670: 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f  ile. A single jo
a680: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68  urnal.** file th
a690: 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74  at referred to t
a6a0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a6b0: 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20  l file has just 
a6c0: 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
a6d0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
a6e0: 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69  e checks if it i
a6f0: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
a700: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
a710: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a  journal file,.**
a720: 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20   and does so if 
a730: 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  it is..**.** The
a740: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a750: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  file contains th
a760: 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63  e names of all c
a770: 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  hild journals..*
a780: 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d  * To tell if a m
a790: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
a7a0: 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68  n be deleted, ch
a7b0: 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74  eck to each of t
a7c0: 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20  he.** children. 
a7d0: 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e   If all children
a7e0: 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73   are either miss
a7f0: 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65  ing or do not re
a800: 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66  fer to.** a diff
a810: 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75  erent master jou
a820: 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  rnal, then this 
a830: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
a840: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a  an be deleted..*
a850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a860: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e  er_delmaster(con
a870: 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
a880: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
a890: 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d  nt master_open =
a8a0: 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a 6d 61   0;.  OsFile *ma
a8b0: 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  ster = 0;.  char
a8c0: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
a8d0: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
a8e0: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
a8f0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
a900: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
a910: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
a920: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
a930: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
a940: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
a950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
a960: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
a970: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
a980: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
a990: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
a9a0: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
a9b0: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
a9c0: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
a9d0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
a9e0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
a9f0: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
aa00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
aa10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 61  =SQLITE_OK || ma
aa20: 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20 72 63  ster );.  if( rc
aa30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
aa40: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
aa50: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
aa60: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
aa70: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 6d 61  te3OsFileSize(ma
aa80: 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f  ster, &nMasterJo
aa90: 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63  urnal);.  if( rc
aaa0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
aab0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
aac0: 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72  ;..  if( nMaster
aad0: 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20  Journal>0 ){.   
aae0: 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b   char *zJournal;
aaf0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
ab00: 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20  erPtr = 0;..    
ab10: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
ab20: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
ab30: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
ab40: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
ab50: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c      ** sqliteMal
ab60: 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
ab70: 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
ab80: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
ab90: 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
aba0: 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
abb0: 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65  iteMalloc(nMaste
abc0: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
abd0: 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  f( !zMasterJourn
abe0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
abf0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
ac00: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ac10: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ter_out;.    }. 
ac20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
ac30: 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20 7a 4d  sRead(master, zM
ac40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
ac50: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
ac60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ac70: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
ac80: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
ac90: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
aca0: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
acb0: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
acc0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
acd0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
ace0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
acf0: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
ad00: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
ad10: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
ad20: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
ad30: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
ad40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
ad50: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
ad60: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
ad70: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
ad80: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
ad90: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
ada0: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
adb0: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
adc0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
add0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
ade0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
adf0: 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20 30 3b  le *journal = 0;
ae00: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
ae10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ae20: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
ae30: 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a  nly(zJournal, &j
ae40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
ae50: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ae60: 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72 6e 61  ITE_OK || journa
ae70: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  l );.        if(
ae80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
ae90: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
aea0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
aeb0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
aec0: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
aed0: 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72 6e 61  erJournal(journa
aee0: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
aef0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
af00: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
af10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
af20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
af30: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
af40: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
af50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
af60: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
af70: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
af80: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
af90: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
afa0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
afb0: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
afc0: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
afd0: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
afe0: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
aff0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
b000: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
b010: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
b020: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b040: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
b050: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
b060: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
b070: 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
b080: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74  e3OsDelete(zMast
b090: 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72 5f  er);..delmaster_
b0a0: 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73 74  out:.  if( zMast
b0b0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
b0c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b0d0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d  terJournal);.  }
b0e0: 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72 5f    .  if( master_
b0f0: 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  open ){.    sqli
b100: 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74  te3OsClose(&mast
b110: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
b120: 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63  n rc;.}...static
b130: 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e   void pager_trun
b140: 63 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72  cate_cache(Pager
b150: 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a   *pPager);../*.*
b160: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d  * Truncate the m
b170: 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20  ain file of the 
b180: 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74  given pager to t
b190: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
b1a0: 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e  es.** indicated.
b1b0: 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74   Also truncate t
b1c0: 68 65 20 63 61 63 68 65 64 20 72 65 70 72 65 73  he cached repres
b1d0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
b1e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
b1f0: 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61  int pager_trunca
b200: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
b210: 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
b220: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b230: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
b240: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
b250: 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
b260: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
b270: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
b280: 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  d, pPager->pageS
b290: 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65 29 3b  ize*(i64)nPage);
b2a0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
b2b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b2c0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
b2d0: 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
b2e0: 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
b2f0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
b300: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b310: 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63 74  .** Set the sect
b320: 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65 20 67  orSize for the g
b330: 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 0a 2a  iven pager..**.*
b340: 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73 69 7a  * The sector siz
b350: 65 20 69 73 20 74 68 65 20 6c 61 72 67 65 72 20  e is the larger 
b360: 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  of the sector si
b370: 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 62  ze reported.** b
b380: 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  y sqlite3OsSecto
b390: 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68 65 20  rSize() and the 
b3a0: 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61  pageSize..*/.sta
b3b0: 74 69 63 20 76 6f 69 64 20 73 65 74 53 65 63 74  tic void setSect
b3c0: 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50  orSize(Pager *pP
b3d0: 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d  ager){.  pPager-
b3e0: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  >sectorSize = sq
b3f0: 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
b400: 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
b410: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63   if( pPager->sec
b420: 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  torSize<pPager->
b430: 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
b440: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
b450: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  ze = pPager->pag
b460: 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eSize;.  }.}../*
b470: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
b480: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
b490: 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
b4a0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
b4b0: 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
b4c0: 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
b4d0: 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
b4e0: 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
b4f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
b500: 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
b510: 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
b520: 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
b530: 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
b540: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
b550: 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
b560: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
b570: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
b580: 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
b590: 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
b5a0: 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
b5b0: 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
b5c0: 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
b5d0: 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
b5e0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
b5f0: 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
b600: 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
b610: 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
b620: 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
b630: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
b640: 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
b650: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
b660: 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
b670: 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
b680: 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
b690: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b6a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
b6b0: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
b6c0: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
b6d0: 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
b6e0: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
b6f0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
b700: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b710: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
b720: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
b730: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  nal.**       nam
b740: 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61  e.  The value ma
b750: 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63  y be zero (indic
b760: 61 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69  ate that there i
b770: 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20  s no master.**  
b780: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a       journal.).*
b790: 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20  *  (6)  N bytes 
b7a0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
b7b0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65  urnal name.  The
b7c0: 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75   name will be nu
b7d0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20  l-terminated.** 
b7e0: 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20        and might 
b7f0: 62 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20  be shorter than 
b800: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
b810: 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65  rom (5).  If the
b820: 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20   first byte.**  
b830: 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65       of the name
b840: 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68   is \000 then th
b850: 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72  ere is no master
b860: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
b870: 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
b880: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73  ournal name is s
b890: 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  tored in UTF-8..
b8a0: 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72  **  (7)  Zero or
b8b0: 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74   more pages inst
b8c0: 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66  ances, each as f
b8d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20  ollows:.**      
b8e0: 20 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65    +  4 byte page
b8f0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20   number..**     
b900: 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61     +  pPager->pa
b910: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
b920: 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20  data..**        
b930: 2b 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73  +  4 byte checks
b940: 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65  um.**.** When we
b950: 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f   speak of the jo
b960: 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65  urnal header, we
b970: 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20   mean the first 
b980: 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a  6 items above..*
b990: 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20  * Each entry in 
b9a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61  the journal is a
b9b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b9c0: 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a  e 7th item..**.*
b9d0: 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65  * Call the value
b9e0: 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64   from the second
b9f0: 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20   bullet "nRec". 
ba00: 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d   nRec is the num
ba10: 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20  ber of.** valid 
ba20: 70 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20  page entries in 
ba30: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
ba40: 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75   most cases, you
ba50: 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65   can compute the
ba60: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  .** value of nRe
ba70: 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  c from the size 
ba80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
ba90: 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70  ile.  But if a p
baa0: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20  ower.** failure 
bab0: 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74  occurred while t
bac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62  he journal was b
bad0: 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74  eing written, it
bae0: 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a   could be the.**
baf0: 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73   case that the s
bb00: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
bb10: 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65  al file had alre
bb20: 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73  ady been increas
bb30: 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78  ed but.** the ex
bb40: 74 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20  tra entries had 
bb50: 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20  not yet made it 
bb60: 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20  safely to disk. 
bb70: 20 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c   In such a case,
bb80: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
bb90: 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
bba0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
bbb0: 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c  e would be too l
bbc0: 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68  arge.  For.** th
bbd0: 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c  at reason, we al
bbe0: 77 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65  ways use the nRe
bbf0: 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68  c value in the h
bc00: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eader..**.** If 
bc10: 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
bc20: 73 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20  s 0xffffffff it 
bc30: 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20  means that nRec 
bc40: 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
bc50: 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ed.** from the f
bc60: 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ile size.  This 
bc70: 76 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68  value is used wh
bc80: 65 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65  en the user sele
bc90: 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79  cts the.** no-sy
bca0: 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68  nc option for th
bcb0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f  e journal.  A po
bcc0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
bcd0: 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70  d lead to corrup
bce0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20  tion.** in this 
bcf0: 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74  case.  But for t
bd00: 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f  hings like tempo
bd10: 72 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63  rary table (whic
bd20: 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c  h will be.** del
bd30: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f  eted when the po
bd40: 77 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29  wer is restored)
bd50: 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20   we don't care. 
bd60: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66   .**.** If the f
bd70: 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68  ile opened as th
bd80: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
bd90: 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72  s not a well-for
bda0: 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  med.** journal f
bdb0: 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  ile then all pag
bdc0: 65 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72  es up to the fir
bdd0: 73 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67  st corrupted pag
bde0: 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  e are rolled.** 
bdf0: 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65  back (or no page
be00: 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s if the journal
be10: 20 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75   header is corru
be20: 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e  pted). The journ
be30: 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68  al file.** is th
be40: 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53  en deleted and S
be50: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
be60: 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f  d, just as if no
be70: 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a   corruption had.
be80: 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  ** been encounte
be90: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  red..**.** If an
bea0: 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29   I/O or malloc()
beb0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
bec0: 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20  he journal-file 
bed0: 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a  is not deleted.*
bee0: 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  * and an error c
bef0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
bf00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
bf10: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61  ager_playback(Pa
bf20: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
bf30: 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34 20 73   isHot){.  i64 s
bf40: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
bf50: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bf60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
bf70: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
bf80: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
bf90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bfa0: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
bfb0: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
bfc0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
bfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bfe0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
bff0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
c000: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c010: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
c020: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
c030: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
c040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c050: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
c060: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
c070: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
c080: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
c090: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
c0a0: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
c0b0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
c0c0: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
c0d0: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
c0e0: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
c0f0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
c100: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
c110: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c120: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c130: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
c140: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
c150: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73  (pPager->jfd, &s
c160: 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  zJ);.  if( rc!=S
c170: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d  QLITE_OK || szJ=
c180: 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  =0 ){.    goto e
c190: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  nd_playback;.  }
c1a0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
c1b0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
c1c0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ame from the jou
c1d0: 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70  rnal, if it is p
c1e0: 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20  resent..  ** If 
c1f0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
c200: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70   file name is sp
c210: 65 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65  ecified, but the
c220: 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a   file is not.  *
c230: 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73  * present on dis
c240: 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72  k, then the jour
c250: 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61  nal is not hot a
c260: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  nd does not need
c270: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79   to be.  ** play
c280: 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed back..  */.  
c290: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
c2a0: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a  ournal(pPager->j
c2b0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
c2c0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
c2d0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
c2e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c2f0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
c300: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
c310: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
c320: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c330: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
c340: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
c350: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
c360: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
c370: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
c380: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
c390: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
c3a0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b  pPager->jfd, 0);
c3b0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
c3c0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a  alOff = 0;..  /*
c3d0: 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
c3e0: 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
c3f0: 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e 61  n the readJourna
c400: 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74 75  lHdr() call retu
c410: 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  rns.  ** SQLITE_
c420: 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65 72  DONE or an IO er
c430: 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20  ror occurs. */. 
c440: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20   while( 1 ){..  
c450: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65    /* Read the ne
c460: 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  xt journal heade
c470: 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  r from the journ
c480: 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  al file.  If the
c490: 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f  re are.    ** no
c4a0: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c  t enough bytes l
c4b0: 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  eft in the journ
c4c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f  al file for a co
c4d0: 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f  mplete header, o
c4e0: 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63  r.    ** it is c
c4f0: 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61  orrupted, then a
c500: 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66   process must of
c510: 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72   failed while wr
c520: 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a  iting it..    **
c530: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
c540: 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65  nothing more nee
c550: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
c560: 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  back..    */.   
c570: 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61   rc = readJourna
c580: 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a  lHdr(pPager, szJ
c590: 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b  , &nRec, &mxPg);
c5a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
c5b0: 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20  ITE_OK ){ .     
c5c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c5d0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
c5e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
c600: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
c610: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
c620: 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66 66  f nRec is 0xffff
c630: 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73 20  ffff, then this 
c640: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65 61  journal was crea
c650: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
c660: 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20  .    ** working 
c670: 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e  in no-sync mode.
c680: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
c690: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c6a0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
c6b0: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c6c0: 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61 72   pages, there ar
c6d0: 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61  e no more journa
c6e0: 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70 75  l headers. Compu
c6f0: 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61  te.    ** the va
c700: 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73 65  lue of nRec base
c710: 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d 70  d on this assump
c720: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
c730: 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66 66   if( nRec==0xfff
c740: 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 61  fffff ){.      a
c750: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
c760: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
c770: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c780: 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63 20  ) );.      nRec 
c790: 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c  = (szJ - JOURNAL
c7a0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29  _HDR_SZ(pPager))
c7b0: 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70  /JOURNAL_PG_SZ(p
c7c0: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
c7d0: 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73     /* If nRec is
c7e0: 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c   0 and this roll
c7f0: 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74 72 61  back is of a tra
c800: 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74 65 64  nsaction created
c810: 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   by this.    ** 
c820: 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68 69 73  process. In this
c830: 20 63 61 73 65 20 74 68 65 20 72 65 73 74 20 6f   case the rest o
c840: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
c850: 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20  le consists of. 
c860: 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64     ** journalled
c870: 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67 65 73   copies of pages
c880: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
c890: 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74 6f 20   read back into 
c8a0: 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20 20 2a  the cache..    *
c8b0: 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  /.    if( nRec==
c8c0: 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b 0a 20  0 && !isHot ){. 
c8d0: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
c8e0: 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   - pPager->journ
c8f0: 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c  alOff) / JOURNAL
c900: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
c910: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c920: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
c930: 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
c940: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
c950: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
c960: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
c970: 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20  le back to it's 
c980: 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20  original size.. 
c990: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
c9a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c9b0: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
c9c0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
c9d0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
c9e0: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
c9f0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
ca00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ca10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ca20: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
ca30: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
ca40: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
ca50: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
ca60: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
ca70: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
ca80: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
ca90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
caa0: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
cab0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
cac0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
cad0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66  ager, pPager->jf
cae0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
caf0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cb00: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
cb10: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
cb20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
cb30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
cb40: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
cb50: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cb60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
cb70: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
cb80: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
cb90: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
cba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cbb0: 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52    }.  }.  /*NOTR
cbc0: 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72  EACHED*/.  asser
cbd0: 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61  t( 0 );..end_pla
cbe0: 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d  yback:.  if( rc=
cbf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
cc00: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
cc10: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
cc20: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
cc30: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f  zMaster ){.    /
cc40: 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
cc50: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
cc60: 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
cc70: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63   will return suc
cc80: 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65  cess,.    ** see
cc90: 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
cca0: 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  le to delete the
ccb0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
ccc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ccd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
cce0: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
ccf0: 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73  r_delmaster(zMas
cd00: 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ter);.    }.    
cd10: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
cd20: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  er);.  }..  /* T
cd30: 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53  he Pager.sectorS
cd40: 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79  ize variable may
cd50: 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61 74   have been updat
cd60: 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67  ed while rolling
cd70: 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75  .  ** back a jou
cd80: 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79 20  rnal created by 
cd90: 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20 61  a process with a
cda0: 20 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f   different secto
cdb0: 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75  r size.  ** valu
cdc0: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
cdd0: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
cde0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
cdf0: 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53 65 63  s..  */.  setSec
ce00: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
ce10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ce20: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
ce30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ce40: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urnal..**.** Thi
ce50: 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  s is similar to 
ce60: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
ce70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
ce80: 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a  rnal but with.**
ce90: 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69   a few extra twi
cea0: 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  sts..**.**    (1
ceb0: 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  )  The number of
cec0: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
ced0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
cee0: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20  he start of.**  
cef0: 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65         the state
cf00: 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69  ment is stored i
cf10: 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  n pPager->stmtSi
cf20: 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a  ze, not in the.*
cf30: 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  *         journa
cf40: 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a  l file itself..*
cf50: 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20  *.**    (2)  In 
cf60: 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79  addition to play
cf70: 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61  ing back the sta
cf80: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20  tement journal, 
cf90: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20  also.**         
cfa0: 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67  playback all pag
cfb0: 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  es of the transa
cfc0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65  ction journal be
cfd0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20  ginning.**      
cfe0: 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61     at offset pPa
cff0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a  ger->stmtJSize..
d000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
d010: 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  ger_stmt_playbac
d020: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
d030: 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20  {.  i64 szJ;    
d040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d050: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c  Size of the full
d060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36   journal */.  i6
d070: 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20  4 hdrOff;.  int 
d080: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
d090: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d0a0: 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69  f Records */.  i
d0b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d0c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d0d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
d0e0: 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50   rc;..  szJ = pP
d0f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d100: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
d110: 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73   .  {.    i64 os
d120: 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73  _szJ;.    rc = s
d130: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
d140: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  (pPager->jfd, &o
d150: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
d160: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d170: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
d180: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
d190: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
d1a0: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
d1b0: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
d1c0: 65 74 20 6a 75 73 74 20 61 66 74 65 72 20 74 68  et just after th
d1d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 61 73  e end of the las
d1e0: 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70  t journal.  ** p
d1f0: 61 67 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  age written befo
d200: 72 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  re the first jou
d210: 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f 72 20  rnal-header for 
d220: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 0a 20  this statement. 
d230: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
d240: 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f 72 20  was written, or 
d250: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
d260: 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61  ile if no journa
d270: 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61  l.  ** header wa
d280: 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a  s written..  */.
d290: 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65    hdrOff = pPage
d2a0: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20  r->stmtHdrOff;. 
d2b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
d2c0: 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64  >fullSync || !hd
d2d0: 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68  rOff );.  if( !h
d2e0: 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72  drOff ){.    hdr
d2f0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20  Off = szJ;.  }. 
d300: 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20   .  /* Truncate 
d310: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
d320: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
d330: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
d340: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
d350: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
d360: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
d370: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d380: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
d390: 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 67  RED );..  /* Fig
d3a0: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
d3b0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
d3c0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d3d0: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
d3e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d3f0: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
d400: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d410: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
d420: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
d430: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
d440: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
d450: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
d460: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d470: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d480: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
d490: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
d4a0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
d4b0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
d4c0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
d4d0: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
d4e0: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
d4f0: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
d500: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
d510: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
d520: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
d530: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
d540: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
d550: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
d560: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d570: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d580: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d590: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
d5a0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d5b0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d5c0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d5d0: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d5e0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d5f0: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
d600: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
d610: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
d620: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
d630: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
d640: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
d650: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d660: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
d670: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
d680: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
d690: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
d6a0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d6b0: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
d6c0: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d6d0: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
d6e0: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
d6f0: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
d700: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
d710: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
d720: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
d730: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d740: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
d750: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
d760: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
d770: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d780: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d790: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d7a0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d7b0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
d7c0: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d7d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d7e0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d7f0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
d800: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d810: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
d820: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
d830: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
d840: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
d850: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d860: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d870: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
d880: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d890: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d8a0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d8b0: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
d8c0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d8d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d8e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d8f0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d900: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
d910: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d920: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
d930: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
d940: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d950: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
d960: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
d970: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
d980: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
d990: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
d9a0: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
d9b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d9c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d9d0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d9e0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
d9f0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
da00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
da10: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
da20: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
da30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
da40: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
da50: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
da60: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
da70: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
da80: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
da90: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
daa0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
dab0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
dac0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
dad0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
dae0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
daf0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
db00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
db10: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
db20: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
db30: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
db40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
db50: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
db60: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
db70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
db80: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
db90: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dba0: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
dbb0: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
dbc0: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
dbd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
dbe0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
dbf0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
dc00: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
dc10: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
dc20: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
dc30: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
dc40: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
dc50: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
dc60: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
dc70: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
dc80: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
dc90: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
dca0: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
dcb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
dcc0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
dcd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
dce0: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
dcf0: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
dd00: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
dd10: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
dd20: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
dd30: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
dd40: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
dd50: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
dd60: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
dd70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
dd80: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
dd90: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
dda0: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
ddb0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
ddc0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
ddd0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
dde0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
ddf0: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
de00: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
de10: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
de20: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
de30: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
de40: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
de50: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
de60: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
de70: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
de80: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
de90: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
dea0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
deb0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
dec0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ded0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
dee0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
def0: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
df00: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
df10: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
df20: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
df30: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
df40: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
df50: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
df60: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
df70: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
df80: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
df90: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
dfa0: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
dfb0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
dfc0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
dfd0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
dfe0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
dff0: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
e000: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
e010: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
e020: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e030: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
e040: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
e050: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
e060: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
e070: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
e080: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
e090: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
e0a0: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
e0b0: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
e0c0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
e0d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
e0e0: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
e0f0: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
e100: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e110: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
e120: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
e130: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
e140: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
e150: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
e160: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
e170: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
e180: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
e190: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
e1a0: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
e1b0: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
e1c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
e1d0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
e1e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e1f0: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
e200: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
e210: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
e220: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
e230: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
e240: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
e250: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
e260: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
e270: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
e280: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
e290: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
e2a0: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
e2b0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e2c0: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
e2d0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
e2e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
e2f0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
e300: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
e310: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
e320: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
e330: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
e340: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e350: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
e360: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
e370: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
e380: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
e390: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
e3a0: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
e3b0: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e3c0: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
e3d0: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
e3e0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
e3f0: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
e400: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e410: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
e420: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e430: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
e440: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
e450: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
e460: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
e470: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e480: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
e490: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
e4a0: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
e4b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
e4c0: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
e4d0: 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a  (OsFile **pFd){.
e4e0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
e4f0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e500: 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
e510: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69  PNAME_SIZE];..#i
e520: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e530: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
e540: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
e550: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e560: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e570: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
e580: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
e590: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
e5a0: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
e5b0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e5c0: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e5d0: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
e5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
e5f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 2a 70  =SQLITE_OK || *p
e600: 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Fd );.  }while( 
e610: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
e620: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
e630: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
e640: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
e650: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
e660: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
e670: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
e680: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
e690: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
e6a0: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
e6b0: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
e6c0: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
e6d0: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
e6e0: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
e6f0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
e700: 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
e710: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
e720: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
e730: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
e740: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
e750: 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
e760: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
e770: 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
e780: 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
e790: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
e7a0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
e7b0: 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
e7c0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
e7d0: 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
e7e0: 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
e7f0: 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
e800: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
e810: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
e820: 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
e830: 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
e840: 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
e850: 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
e860: 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
e870: 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
e880: 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
e890: 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
e8a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
e8b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
e8c0: 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  erOpen(.  Pager 
e8d0: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
e8e0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
e8f0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
e900: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
e910: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
e920: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
e930: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
e940: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
e950: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
e960: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
e970: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
e980: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
e990: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
e9a0: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
e9b0: 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
e9c0: 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
e9d0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
e9e0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 63 68  pPager = 0;.  ch
e9f0: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
ea00: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d  e = 0;.  int nam
ea10: 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70 69 6c  eLen;  /* Compil
ea20: 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54 68 69  er is wrong. Thi
ea30: 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  s is always init
ea40: 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65 20 75  ialized before u
ea50: 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 2a  se */.  OsFile *
ea60: 66 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  fd = 0;.  int rc
ea70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ea80: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  int i;.  int tem
ea90: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
eaa0: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
eab0: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
eac0: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
ead0: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
eae0: 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
eaf0: 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64  =0;.  int noRead
eb00: 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
eb10: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
eb20: 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54  K)!=0;.  char zT
eb30: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
eb40: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65  AME_SIZE];.#ifde
eb50: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
eb60: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
eb70: 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
eb80: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
eb90: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
eba0: 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
ebb0: 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
ebc0: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
ebd0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
ebe0: 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
ebf0: 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
ec00: 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
ec10: 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
ec20: 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
ec30: 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
ec40: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
ec50: 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
ec60: 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
ec70: 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20  loc can be set. 
ec80: 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65  It would be nice
ec90: 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20   to assert.  ** 
eca0: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
ecb0: 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65  nAlloc is non-ze
ecc0: 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69  ro, but alas thi
ecd0: 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61  s breaks test ca
ece0: 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  ses .  ** writte
ecf0: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
ed00: 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a  pager directly..
ed10: 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
ed20: 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
ed30: 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
ed40: 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b   assert( pTsd );
ed50: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 65  .#endif..  /* We
ed60: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 69 66   used to test if
ed70: 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20 61 6c   malloc() had al
ed80: 72 65 61 64 79 20 66 61 69 6c 65 64 20 62 65 66  ready failed bef
ed90: 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
eda0: 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 77 61  .  ** But the wa
edb0: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
edc0: 69 73 20 75 73 65 64 20 69 6e 20 53 51 4c 69 74  is used in SQLit
edd0: 65 20 6d 65 61 6e 73 20 74 68 61 74 20 63 61 6e  e means that can
ede0: 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61 70 70   never.  ** happ
edf0: 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  en. Furthermore,
ee00: 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63 2d 66   if the malloc-f
ee10: 61 69 6c 65 64 20 66 6c 61 67 20 69 73 20 61 6c  ailed flag is al
ee20: 72 65 61 64 79 20 73 65 74 2c 20 0a 20 20 2a 2a  ready set, .  **
ee30: 20 65 69 74 68 65 72 20 74 68 65 20 63 61 6c 6c   either the call
ee40: 20 74 6f 20 73 71 6c 69 74 65 53 74 72 44 75 70   to sqliteStrDup
ee50: 28 29 20 6f 72 20 73 71 6c 69 74 65 4d 61 6c 6c  () or sqliteMall
ee60: 6f 63 28 29 20 62 65 6c 6f 77 20 77 69 6c 6c 0a  oc() below will.
ee70: 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72 74 6c    ** fail shortl
ee80: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  y and SQLITE_NOM
ee90: 45 4d 20 72 65 74 75 72 6e 65 64 20 61 6e 79 77  EM returned anyw
eea0: 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61  ay..  */.  *ppPa
eeb0: 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4f  ger = 0;..  /* O
eec0: 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
eed0: 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75 6c 6c  le and set zFull
eee0: 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f 69 6e  Pathname to poin
eef0: 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65 64 20  t at malloc()ed 
ef00: 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63 6f 6e  .  ** memory con
ef10: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f 6d 70  taining the comp
ef20: 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20 28 69  lete filename (i
ef30: 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .e. including th
ef40: 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a 20 20  e directory)..  
ef50: 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
ef60: 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
ef70: 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  0] ){.#ifndef SQ
ef80: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
ef90: 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  DB.    if( strcm
efa0: 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65  p(zFilename,":me
efb0: 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20  mory:")==0 ){.  
efc0: 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20      memDb = 1;. 
efd0: 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61       zFullPathna
efe0: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
eff0: 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  p("");.    }else
f000: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
f010: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
f020: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
f030: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
f040: 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
f050: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
f060: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f070: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 57  lite3OsOpenReadW
f080: 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rite(zFullPathna
f090: 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64 4f 6e  me, &fd, &readOn
f0a0: 6c 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ly);.        ass
f0b0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
f0c0: 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a 20 20 20 20  OK || fd );.    
f0d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
f0e0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
f0f0: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
f100: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
f110: 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65  e3OsTempFileName
f120: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a 46 69  (zTemp);.    zFi
f130: 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a  lename = zTemp;.
f140: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
f150: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c  e = sqlite3OsFul
f160: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
f170: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
f180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f190: 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20       tempFile = 
f1a0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
f1b0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
f1c0: 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2e  Pager structure.
f1d0: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
f1e0: 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  same allocation,
f1f0: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73   allocate.  ** s
f200: 70 61 63 65 20 66 6f 72 20 74 68 65 20 66 75 6c  pace for the ful
f210: 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65 20 66  l paths of the f
f220: 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79 20 61  ile, directory a
f230: 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  nd journal .  **
f240: 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d   (Pager.zFilenam
f250: 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65 63 74  e, Pager.zDirect
f260: 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e 7a 4a  ory and Pager.zJ
f270: 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20  ournal)..  */.  
f280: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
f290: 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c 65 6e  e ){.    nameLen
f2a0: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
f2b0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 70 50  athname);.    pP
f2c0: 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c  ager = sqliteMal
f2d0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61  loc( sizeof(*pPa
f2e0: 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33  ger) + nameLen*3
f2f0: 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69 66 28   + 30 );.    if(
f300: 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d 53   pPager && rc==S
f310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f320: 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
f330: 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ace = (char *)sq
f340: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 53 51  liteMallocRaw(SQ
f350: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
f360: 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20  E_SIZE);.    }. 
f370: 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20   }...  /* If an 
f380: 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e  error occured in
f390: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62   either of the b
f3a0: 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66 72 65  locks above, fre
f3b0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a 20 20  e the memory .  
f3c0: 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
f3d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   zFullPathname, 
f3e0: 66 72 65 65 20 74 68 65 20 50 61 67 65 72 20 73  free the Pager s
f3f0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f  tructure and clo
f400: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 6c  se the .  ** fil
f410: 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  e. Since the pag
f420: 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
f430: 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
f440: 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
f450: 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
f460: 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
f470: 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
f480: 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74 68 6e  r || !zFullPathn
f490: 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  ame || !pPager->
f4a0: 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72 63 21  pTmpSpace || rc!
f4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f4c0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
f4d0: 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&fd);.    sqlit
f4e0: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
f4f0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
f500: 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
f510: 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d 3d 53    return ((rc==S
f520: 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49 54 45  QLITE_OK)?SQLITE
f530: 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a  _NOMEM:rc);.  }.
f540: 0a 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22  .  PAGERTRACE3("
f550: 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
f560: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c  ILEHANDLEID(fd),
f570: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
f580: 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
f590: 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
f5a0: 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  er, zFullPathnam
f5b0: 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e)).  pPager->zF
f5c0: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
f5d0: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
f5e0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f5f0: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
f600: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
f610: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
f620: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
f630: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
f640: 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  Len+1];.  memcpy
f650: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
f660: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
f670: 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b 0a 20  e, nameLen+1);. 
f680: 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
f690: 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75 6c  zDirectory, zFul
f6a0: 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c  lPathname, nameL
f6b0: 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  en+1);..  for(i=
f6c0: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
f6d0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f6e0: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
f6f0: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
f700: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f710: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
f720: 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
f730: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
f740: 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c 65 6e 29 3b  thname,nameLen);
f750: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46  .  sqliteFree(zF
f760: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f770: 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
f780: 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e  zJournal[nameLen
f790: 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 73 69  ], "-journal",si
f7a0: 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29  zeof("-journal")
f7b0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
f7c0: 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61 67 65  = fd;.  /* pPage
f7d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
f7e0: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
f7f0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
f800: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
f810: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
f820: 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
f830: 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
f840: 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
f850: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
f860: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
f870: 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
f880: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
f890: 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
f8a0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
f8b0: 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
f8c0: 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54  pageSize = SQLIT
f8d0: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
f8e0: 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  IZE;.  /* pPager
f8f0: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20  ->stmtSize = 0; 
f900: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f910: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a  stmtJSize = 0; *
f920: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f930: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
f940: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
f950: 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  100;.  pPager->m
f960: 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d  xPgno = SQLITE_M
f970: 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20  AX_PAGE_COUNT;. 
f980: 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55   assert( PAGER_U
f990: 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a  NLOCK==0 );.  /*
f9a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
f9b0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
f9c0: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  /.  /* pPager->e
f9d0: 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
f9e0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
f9f0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
fa00: 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
fa10: 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
fa20: 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
fa30: 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
fa40: 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
fa50: 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
fa60: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
fa70: 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
fa80: 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
fa90: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
faa0: 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65  eMode = tempFile
fab0: 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
fac0: 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
fad0: 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
fae0: 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
faf0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
fb00: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
fb10: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
fb20: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
fb30: 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
fb40: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
fb50: 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
fb60: 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70 50 61  c?0:1);.  /* pPa
fb70: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
fb80: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
fb90: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
fba0: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
fbb0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f  r->pLast = 0; */
fbc0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  .  pPager->nExtr
fbd0: 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d  a = FORCE_ALIGNM
fbe0: 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 61  ENT(nExtra);.  a
fbf0: 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44 62 29  ssert(fd||memDb)
fc00: 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29  ;.  if( !memDb )
fc10: 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f 72 53  {.    setSectorS
fc20: 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ize(pPager);.  }
fc30: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42  .  /* pPager->pB
fc40: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20  usyHandler = 0; 
fc50: 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70  */.  /* memset(p
fc60: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
fc70: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
fc80: 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70  aHash)); */.  *p
fc90: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
fcb0: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
fcc0: 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72  AGEMENT.  pPager
fcd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e  ->pNext = pTsd->
fce0: 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e  pPager;.  pTsd->
fcf0: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
fd00: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
fd10: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fd20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
fd30: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
fd40: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
fd50: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
fd60: 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50  andler(Pager *pP
fd70: 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65  ager, BusyHandle
fd80: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29  r *pBusyHandler)
fd90: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73  {.  pPager->pBus
fda0: 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79  yHandler = pBusy
fdb0: 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  Handler;.}../*.*
fdc0: 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72 75  * Set the destru
fdd0: 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61  ctor for this pa
fde0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
fdf0: 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  L, the destructo
fe00: 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77  r is called.** w
fe10: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
fe20: 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20  e count on each 
fe30: 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65 72  page reaches zer
fe40: 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63 74  o.  The destruct
fe50: 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65  or can.** be use
fe60: 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e  d to clean up in
fe70: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
fe80: 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61   extra segment a
fe90: 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20  ppended to each 
fea0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
feb0: 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f  destructor is no
fec0: 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65  t called as a re
fed0: 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65  sult sqlite3Page
fee0: 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44  rClose().  .** D
fef0: 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f  estructors are o
ff00: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
ff10: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
ff20: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
ff30: 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72 75  e3PagerSetDestru
ff40: 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67  ctor(Pager *pPag
ff50: 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63  er, void (*xDesc
ff60: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b  )(DbPage*,int)){
ff70: 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  .  pPager->xDest
ff80: 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a  ructor = xDesc;.
ff90: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
ffa0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66   reinitializer f
ffb0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
ffc0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
ffd0: 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a   reinitializer.*
ffe0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  * is called when
fff0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
10000 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20  a page in cache 
10010 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
10020 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76  ts original.** v
10030 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c 74  alue as a result
10040 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20   of a rollback. 
10050 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69   The callback gi
10060 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c  ves higher-level
10070 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f   code.** an oppo
10080 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f  rtunity to resto
10090 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65 63  re the EXTRA sec
100a0 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69  tion to agree wi
100b0 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a  th the restored.
100c0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  ** page data..*/
100d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
100e0 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50 61  erSetReiniter(Pa
100f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
10100 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50  d (*xReinit)(DbP
10110 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
10120 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
10130 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a  = xReinit;.}../*
10140 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67 65  .** Set the page
10150 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74   size.  Return t
10160 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66  he new size.  If
10170 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65 77   the suggest new
10180 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73   page.** size is
10190 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20   inappropriate, 
101a0 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74  then an alternat
101b0 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  ive page size is
101c0 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64   selected.** and
101d0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
101e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  t sqlite3PagerSe
101f0 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72 20  tPagesize(Pager 
10200 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67  *pPager, int pag
10210 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  eSize){.  assert
10220 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
10230 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
10240 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
10250 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  E );.  if( !pPag
10260 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61  er->memDb && pPa
10270 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ger->nRef==0 ){.
10280 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
10290 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
102a0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
102b0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  pageSize;.    pP
102c0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
102d0 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  = sqlite3Realloc
102e0 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70  OrFree(pPager->p
102f0 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65 53 69  TmpSpace, pageSi
10300 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ze);.  }.  retur
10310 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n pPager->pageSi
10320 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ze;.}../*.** Att
10330 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20  empt to set the 
10340 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65  maximum database
10350 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20 6d   page count if m
10360 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
10370 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  e. .** Make no c
10380 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67 65  hanges if mxPage
10390 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61   is zero or nega
103a0 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65 72  tive.  And never
103b0 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d   reduce the.** m
103c0 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
103d0 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72 72  t below the curr
103e0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
103f0 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
10400 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d 78  Regardless of mx
10410 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
10420 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d   current maximum
10430 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
10440 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10450 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61 67  MaxPageCount(Pag
10460 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
10470 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20 6d  mxPage){.  if( m
10480 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 70  xPage>0 ){.    p
10490 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20  Pager->mxPgno = 
104a0 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73 71  mxPage;.  }.  sq
104b0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
104c0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 72  unt(pPager);.  r
104d0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6d 78  eturn pPager->mx
104e0 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Pgno;.}../*.** T
104f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
10500 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
10510 20 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65   used to disable
10520 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a   the simulated.*
10530 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68  * I/O error mech
10540 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f  anism.  These ro
10550 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
10560 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74  to avoid simulat
10570 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20  ed.** errors in 
10580 70 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20  places where we 
10590 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
105a0 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  t errors..**.** 
105b0 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f  Unless -DSQLITE_
105c0 54 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20  TEST=1 is used, 
105d0 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  these routines a
105e0 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a  re all no-ops.**
105f0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f   and generate no
10600 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66   code..*/.#ifdef
10610 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74   SQLITE_TEST.ext
10620 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
10630 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
10640 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ;.extern int sql
10650 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69  ite3_io_error_hi
10660 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  t;.static int sa
10670 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 64 69  ved_cnt;.void di
10680 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
10690 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
106a0 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73  .  saved_cnt = s
106b0 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
106c0 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
106d0 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
106e0 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64  ing = -1;.}.void
106f0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
10700 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
10710 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ){.  sqlite3_io_
10720 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
10730 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c  saved_cnt;.}.#el
10740 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61  se.# define disa
10750 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10760 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69  _errors().# defi
10770 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  ne enable_simula
10780 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
10790 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
107a0 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
107b0 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
107c0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
107d0 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
107e0 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
107f0 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20  ints to. .**.** 
10800 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  No error checkin
10810 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72  g is done. The r
10820 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73  ational for this
10830 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
10840 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62  nction .** may b
10850 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66  e called even if
10860 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
10870 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74  ot exist or cont
10880 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e  ain a header. In
10890 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73   .** these cases
108a0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29   sqlite3OsRead()
108b0 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20   will return an 
108c0 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20  error, to which 
108d0 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20  the correct .** 
108e0 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a  response is to z
108f0 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ero the memory a
10900 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74  t pDest and cont
10910 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f  inue.  A real IO
10920 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20   error .** will 
10930 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72  presumably recur
10940 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75   and be picked u
10950 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54  p later (Todo: T
10960 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29  hink about this)
10970 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10980 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
10990 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  der(Pager *pPage
109a0 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e  r, int N, unsign
109b0 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b  ed char *pDest){
109c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
109d0 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28  TE_OK;.  memset(
109e0 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
109f0 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a  if( MEMDB==0 ){.
10a00 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
10a10 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10a20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
10a30 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
10a40 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f   0);.    enable_
10a50 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10a60 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41  ors();.    IOTRA
10a70 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
10a80 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
10a90 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
10aa0 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
10ab0 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b  ->fd, pDest, N);
10ac0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
10ad0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
10ae0 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63  READ ){.      rc
10af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10b00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10b10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
10b20 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
10b30 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
10b40 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
10b50 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
10b60 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a  ** pPager. .**.*
10b70 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47  * If the PENDING
10b80 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68  _BYTE lies on th
10b90 65 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20  e page directly 
10ba0 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66  after the end of
10bb0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68   the.** file, th
10bc0 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73  en consider this
10bd0 20 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68   page part of th
10be0 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20  e file too. For 
10bf0 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50  example, if.** P
10c00 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62  ENDING_BYTE is b
10c10 79 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69  yte 4096 (the fi
10c20 72 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65  rst byte of page
10c30 20 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65   5) and the size
10c40 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   of the.** file 
10c50 69 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35  is 4096 bytes, 5
10c60 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73   is returned ins
10c70 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e  tead of 4..*/.in
10c80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  t sqlite3PagerPa
10c90 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
10ca0 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b  Pager){.  i64 n;
10cb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
10cc0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
10cd0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10ce0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
10cf0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
10d00 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
10d10 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e>=0 ){.    n = 
10d20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
10d30 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69    } else {.    i
10d40 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
10d50 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
10d60 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c  r->fd, &n))!=SQL
10d70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10d80 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
10d90 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72  er, rc);.      r
10da0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
10db0 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c     if( n>0 && n<
10dc0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10dd0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b   ){.      n = 1;
10de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10df0 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70    n /= pPager->p
10e00 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20  ageSize;.    }. 
10e10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
10e20 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
10e30 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
10e40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a  er->dbSize = n;.
10e50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10e60 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  n==(PENDING_BYTE
10e70 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
10e80 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20  e) ){.    n++;. 
10e90 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65   }.  if( n>pPage
10ea0 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
10eb0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
10ec0 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = n;.  }.  retur
10ed0 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  n n;.}...#ifndef
10ee0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
10ef0 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ORYDB./*.** Clea
10f00 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
10f10 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
10f20 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
10f30 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
10f40 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
10f50 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
10f60 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
10f70 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
10f80 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
10f90 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
10fa0 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
10fb0 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
10fc0 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
10fd0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
10fe0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
10ff0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
11000 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ager*);../*.** U
11010 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
11020 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
11030 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67  Also set the pag
11040 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f  e number to 0 to
11050 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61   indicate.** tha
11060 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
11070 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61  t part of any ha
11080 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69  sh chain. This i
11090 73 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75  s required becau
110a0 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  se the.** sqlite
110b0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29  3PagerMovepage()
110c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61   routine can lea
110d0 76 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  ve a page in the
110e0 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70   .** pNextFree/p
110f0 50 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68  PrevFree list th
11100 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74  at is not a part
11110 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61   of any hash-cha
11120 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  in..*/.static vo
11130 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  id unlinkHashCha
11140 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
11150 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  , PgHdr *pPg){. 
11160 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
11170 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11180 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d   pPg->pNextHash=
11190 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76  =0 && pPg->pPrev
111a0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Hash==0 );.    r
111b0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
111c0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
111d0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
111e0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
111f0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
11200 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
11210 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
11220 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11230 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67  r->aHash[pPg->pg
11240 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
11250 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a  ash-1)]!=pPg );.
11260 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
11270 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  sh->pNextHash = 
11280 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
11290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
112a0 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
112b0 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d   (pPager->nHash-
112c0 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  1);.    pPager->
112d0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e  aHash[h] = pPg->
112e0 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20  pNextHash;.  }. 
112f0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
11300 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50    clearHistory(P
11310 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
11320 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a  , pPager));.  }.
11330 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
11340 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
11350 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61  h = pPg->pPrevHa
11360 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sh = 0;.}../*.**
11370 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66   Unlink a page f
11380 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
11390 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61  t (the list of a
113a0 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e  ll pages where n
113b0 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66  Ref==0).** and f
113c0 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c  rom its hash col
113d0 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f  lision chain..*/
113e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
113f0 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  inkPage(PgHdr *p
11400 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
11410 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
11420 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 74  er;..  /* Keep t
11430 68 65 20 70 46 69 72 73 74 53 79 6e 63 65 64 20  he pFirstSynced 
11440 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
11450 20 61 74 20 74 68 65 20 66 69 72 73 74 20 73 79   at the first sy
11460 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67 65 20  nchronized page 
11470 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 50  */.  if( pPg==pP
11480 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11490 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
114a0 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  *p = pPg->pNextF
114b0 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ree;.    while( 
114c0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
114d0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
114e0 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50 61 67  Free; }.    pPag
114f0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
11500 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = p;.  }..  /* 
11510 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20  Unlink from the 
11520 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 66  freelist */.  if
11530 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
11540 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   ){.    pPg->pPr
11550 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
11560 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  e = pPg->pNextFr
11570 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
11580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11590 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29 3b 0a  >pFirst==pPg );.
115a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
115b0 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
115c0 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ree;.  }.  if( p
115d0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b  Pg->pNextFree ){
115e0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
115f0 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
11600 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
11610 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
11620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 4c  sert( pPager->pL
11630 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  ast==pPg );.    
11640 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
11650 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11660 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
11670 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
11680 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  vFree = 0;..  /*
11690 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68 65   Unlink from the
116a0 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c 65   pgno hash table
116b0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
116c0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
116d0 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  g);.}../*.** Thi
116e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
116f0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  d to truncate th
11700 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20 64  e cache when a d
11710 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74 72  atabase.** is tr
11720 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20 66  uncated.  Drop f
11730 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61 6c  rom the cache al
11740 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70 67  l pages whose pg
11750 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72 20  no is.** larger 
11760 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53  than pPager->dbS
11770 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66  ize and is unref
11780 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52  erenced..**.** R
11790 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
117a0 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
117b0 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
117c0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74  eroed..**.** Act
117d0 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70 6f  ually, at the po
117e0 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
117f0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 77   is called, it w
11800 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65 72  ould be.** an er
11810 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72 65  ror to have a re
11820 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20 20  ferenced page.  
11830 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  But rather than 
11840 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20 70  delete.** that p
11850 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74 65  age and guarante
11860 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 73  e a subsequent s
11870 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65 6d  egfault, it seem
11880 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20 7a  s better.** to z
11890 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65 20  ero it and hope 
118a0 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f 75  that we error ou
118b0 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61  t sanely..*/.sta
118c0 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74  tic void pager_t
118d0 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61  runcate_cache(Pa
118e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
118f0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67  PgHdr *pPg;.  Pg
11900 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e  Hdr **ppPg;.  in
11910 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  t dbSize = pPage
11920 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70  r->dbSize;..  pp
11930 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41  Pg = &pPager->pA
11940 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50  ll;.  while( (pP
11950 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b  g = *ppPg)!=0 ){
11960 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
11970 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20  no<=dbSize ){.  
11980 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
11990 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
119a0 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52  else if( pPg->nR
119b0 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ef>0 ){.      me
119c0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
119d0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
119e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
119f0 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67       ppPg = &pPg
11a00 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11a10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70  }else{.      *pp
11a20 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41  Pg = pPg->pNextA
11a30 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ll;.      IOTRAC
11a40 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
11a50 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
11a60 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
11a70 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
11a80 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
11a90 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 75 6e  count);.      un
11aa0 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
11ab0 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70       makeClean(p
11ac0 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Pg);.      sqlit
11ad0 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  eFree(pPg);.    
11ae0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d    pPager->nPage-
11af0 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  -;.    }.  }.}..
11b00 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
11b10 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
11b20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
11b30 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
11b40 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
11b50 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
11b60 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
11b70 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
11b80 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
11b90 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
11ba0 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
11bb0 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
11bc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
11bd0 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
11be0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
11bf0 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
11c00 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
11c10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
11c20 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
11c30 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11c40 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
11c50 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
11c60 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d  OS lock values m
11c70 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
11c80 61 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63  as the Pager loc
11c90 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73  k values */.  as
11ca0 73 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52  sert( PAGER_SHAR
11cb0 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ED==SHARED_LOCK 
11cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
11cd0 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53  ER_RESERVED==RES
11ce0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  ERVED_LOCK );.  
11cf0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58  assert( PAGER_EX
11d00 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49  CLUSIVE==EXCLUSI
11d10 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a  VE_LOCK );..  /*
11d20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
11d30 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b  currently unlock
11d40 65 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65  ed then the size
11d50 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e   must be unknown
11d60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
11d70 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
11d80 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61  ER_SHARED || pPa
11d90 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c  ger->dbSize<0 ||
11da0 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28   MEMDB );..  if(
11db0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
11dc0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
11dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20    }else{.    do 
11df0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
11e00 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
11e10 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29  r->fd, locktype)
11e20 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63  ;.    }while( rc
11e30 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
11e40 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
11e50 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72  syHandler(pPager
11e60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20  ->pBusyHandler) 
11e70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11e90 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
11ea0 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  = locktype;.    
11eb0 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
11ec0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
11ed0 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
11ee0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
11ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
11f00 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
11f10 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
11f20 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65 64   pages specified
11f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11f40 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 50 61  PagerTruncate(Pa
11f50 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
11f60 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
11f70 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  rc;.  assert( pP
11f80 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
11f90 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d  ER_SHARED || MEM
11fa0 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  DB );.  sqlite3P
11fb0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
11fc0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
11fd0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
11fe0 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d      rc = pPager-
11ff0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65  >errCode;.    re
12000 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
12010 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
12020 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
12030 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
12040 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12050 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
12060 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
12070 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70  e = nPage;.    p
12080 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61  ager_truncate_ca
12090 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
120a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
120b0 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
120c0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
120d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
120e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
120f0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
12100 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
12110 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
12120 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
12130 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
12140 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
12150 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
12160 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
12170 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
12190 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72  urn rc;.  }..  r
121a0 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
121b0 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
121c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
121d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
121e0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
121f0 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
12200 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
12210 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
12220 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
12230 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
12240 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
12250 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
12260 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
12270 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
12280 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
12290 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
122a0 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
122b0 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
122c0 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
122d0 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
122e0 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
122f0 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
12300 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
12310 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
12320 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
12330 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
12340 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  mp..**.** This f
12350 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 73  unction always s
12360 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74 72  ucceeds. If a tr
12370 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
12380 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a  ive an attempt.*
12390 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c  * is made to rol
123a0 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61 6e  l it back. If an
123b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
123c0 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  ring the rollbac
123d0 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72  k .** a hot jour
123e0 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74 20  nal may be left 
123f0 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  in the filesyste
12400 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 69  m but no error i
12410 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f  s returned.** to
12420 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a   the caller..*/.
12430 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12440 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  Close(Pager *pPa
12450 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  ger){.#ifdef SQL
12460 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
12470 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
12480 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
12490 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
124a0 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
124b0 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
124c0 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
124d0 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
124e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
124f0 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
12500 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
12510 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
12520 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
12530 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
12540 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
12550 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
12560 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
12570 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
12580 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  an be set..  */.
12590 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
125a0 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
125b0 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
125c0 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a 20 20  rt( pPager );.  
125d0 61 73 73 65 72 74 28 20 70 54 73 64 20 26 26 20  assert( pTsd && 
125e0 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a  pTsd->nAlloc );.
125f0 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c  #endif..  disabl
12600 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
12610 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65  rrors();.  pPage
12620 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
12630 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
12640 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
12650 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
12660 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  r);.  pagerUnloc
12670 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
12680 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  ger);.  enable_s
12690 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
126a0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
126b0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
126c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
126d0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
126e0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
126f0 67 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20  ger)).  assert( 
12700 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
12710 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
12720 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
12730 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
12740 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
12750 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
12760 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
12770 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
12780 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
12790 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
127a0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28  nJournal);.  if(
127b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
127c0 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
127d0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
127e0 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71  >stfd);.  }.  sq
127f0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
12800 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20  ager->fd);.  /* 
12810 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61  Temp files are a
12820 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
12830 65 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20  eted by the OS. 
12840 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e   ** if( pPager->
12850 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a  tempFile ){.  **
12860 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
12870 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  te(pPager->zFile
12880 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20  name);.  ** }.  
12890 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
128a0 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
128b0 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20  MANAGEMENT.  /* 
128c0 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 72  Remove the pager
128d0 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64   from the linked
128e0 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72 73 20   list of pagers 
128f0 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20 20 2a  starting at .  *
12900 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70 50 61  * ThreadData.pPa
12910 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  ger if memory-ma
12920 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
12930 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  led..  */.  if( 
12940 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50  pPager==pTsd->pP
12950 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54 73 64  ager ){.    pTsd
12960 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
12970 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  r->pNext;.  }els
12980 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 54  e{.    Pager *pT
12990 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54 6d 70  mp;.    for(pTmp
129a0 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65 72 3b   = pTsd->pPager;
129b0 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50   pTmp->pNext!=pP
129c0 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d  ager; pTmp=pTmp-
129d0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20 70 54  >pNext){}.    pT
129e0 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67  mp->pNext = pPag
129f0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23  er->pNext;.  }.#
12a00 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 46 72  endif.  sqliteFr
12a10 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
12a20 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
12a30 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
12a40 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
12a50 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
12a60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12a70 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
12a80 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
12a90 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
12aa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
12ab0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
12ac0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
12ad0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
12ae0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
12af0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
12b00 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
12b10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
12b20 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
12b30 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
12b40 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
12b50 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
12b60 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
12b70 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
12b80 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
12b90 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
12ba0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
12bb0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
12bc0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
12bd0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
12be0 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
12bf0 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
12c00 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
12c10 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
12c20 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
12c30 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
12c40 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
12c50 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
12c60 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
12c70 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
12c80 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
12c90 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
12ca0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
12cb0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
12cc0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
12cd0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12ce0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
12cf0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
12d00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
12d10 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
12d20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
12d30 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12d40 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
12d50 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
12d60 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
12d70 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
12d80 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
12d90 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
12da0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
12db0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12dc0 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
12dd0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
12de0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
12df0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
12e00 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
12e10 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
12e20 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
12e30 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
12e40 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
12e50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
12e60 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
12e70 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
12e80 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
12e90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
12ea0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12eb0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
12ec0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
12ed0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12ee0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
12ef0 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
12f00 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
12f10 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
12f20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
12f30 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
12f40 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
12f50 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
12f60 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
12f70 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
12f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12f90 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
12fa0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
12fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
12fc0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
12fd0 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
12fe0 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
12ff0 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
13000 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
13010 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
13020 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
13030 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
13040 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
13050 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
13060 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
13070 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
13080 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
13090 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61 67  age *pPg){.  pag
130a0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65  e_ref(pPg);.  re
130b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
130c0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
130d0 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f  e journal.  In o
130e0 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65  ther words, make
130f0 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61   sure all the pa
13100 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  ges that have.**
13110 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
13120 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76   the journal hav
13130 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68  e actually reach
13140 65 64 20 74 68 65 20 73 75 72 66 61 63 65 20 6f  ed the surface o
13150 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20  f the.** disk.  
13160 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  It is not safe t
13170 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69  o modify the ori
13180 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
13190 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a  ile until after.
131a0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
131b0 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20  as been synced. 
131c0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
131d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64   database is mod
131e0 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ified before.** 
131f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
13200 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65  ynced and a powe
13210 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
13220 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a  , the unsynced j
13230 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77  ournal.** data w
13240 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64  ould be lost and
13250 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61   we would be una
13260 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  ble to completel
13270 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a  y rollback the.*
13280 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
13290 65 73 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  es.  Database co
132a0 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f  rruption would o
132b0 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  ccur..** .** Thi
132c0 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75  s routine also u
132d0 70 64 61 74 65 73 20 74 68 65 20 6e 52 65 63 20  pdates the nRec 
132e0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61  field in the hea
132f0 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  der of the journ
13300 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d  al..** (See comm
13310 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ents on the page
13320 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75  r_playback() rou
13330 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
13340 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
13350 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63  ).** If the sync
13360 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74   mode is FULL, t
13370 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63  wo syncs will oc
13380 63 75 72 2e 20 20 46 69 72 73 74 20 74 68 65 20  cur.  First the 
13390 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  whole journal.**
133a0 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e   is synced, then
133b0 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
133c0 69 73 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e  is updated, then
133d0 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f   a second sync o
133e0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ccurs..**.** For
133f0 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
13400 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20  ases, we do not 
13410 63 61 72 65 20 69 66 20 77 65 20 61 72 65 20 61  care if we are a
13420 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  ble to rollback.
13430 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  ** after a power
13440 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e   failure, so syn
13450 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  c occurs..**.** 
13460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65  This routine cle
13470 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ars the needSync
13480 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
13490 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c  page current hel
134a0 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a  d in.** memory..
134b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
134c0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ncJournal(Pager 
134d0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
134e0 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
134f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
13500 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
13510 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
13520 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
13530 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
13540 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
13550 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
13560 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
13570 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
13580 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
13590 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
135a0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
135b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
135c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
135d0 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  pen );.      /* 
135e0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
135f0 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f  >noSync ); // no
13600 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65  Sync might be se
13610 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  t if synchronous
13620 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75  .      ** was tu
13630 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74  rned off after t
13640 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
13650 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63  as started.  Tic
13660 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e  ket #615 */.#ifn
13670 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
13680 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61   {.        /* Ma
13690 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67  ke sure the pPag
136a0 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72  er->nRec counter
136b0 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20   we are keeping 
136c0 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a  agrees.        *
136d0 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20  * with the nRec 
136e0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
136f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
13700 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
13710 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
13720 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20  64 jSz;.        
13730 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
13740 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
13750 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20  fd, &jSz);.     
13760 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
13770 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13780 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13790 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53  ->journalOff==jS
137a0 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  z );.      }.#en
137b0 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
137c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
137d0 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
137e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
137f0 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
13800 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
13810 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
13820 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
13830 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
13840 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
13850 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
13860 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
13870 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
13880 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
13890 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
138a0 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
138b0 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
138c0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  . .        */.  
138d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
138e0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
138f0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
13900 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
13910 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
13920 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13930 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
13940 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
13950 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
13960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13970 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
13980 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
13990 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
139a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
139b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
139c0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
139d0 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20  er->jfd,.       
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13a00 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
13a10 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
13a20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
13a30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
13a40 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
13a50 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
13a60 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20 20 20  ", pPager,.     
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
13a80 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
13a90 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
13aa0 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20 20 20  lMagic), 4)).   
13ab0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
13ac0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
13ad0 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  d, pPager->nRec)
13ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13af0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
13b00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13b10 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
13b20 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
13b30 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
13b40 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
13b50 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13b60 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
13b70 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
13b80 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
13b90 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
13ba0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
13bb0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
13bc0 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ).      rc = sql
13bd0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
13be0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
13bf0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 20  full_fsync);.   
13c00 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72     if( rc!=0 ) r
13c10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13c20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
13c30 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20  tarted = 1;.    
13c40 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
13c50 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
13c60 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65   /* Erase the ne
13c70 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d  edSync flag from
13c80 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20   every page..   
13c90 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   */.    for(pPg=
13ca0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
13cb0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
13cc0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
13cd0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
13ce0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
13cf0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
13d00 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
13d10 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  .  }..#ifndef ND
13d20 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65  EBUG.  /* If the
13d30 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20   Pager.needSync 
13d40 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68  flag is clear th
13d50 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  en the PgHdr.nee
13d60 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20  dSync.  ** flag 
13d70 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65  must also be cle
13d80 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73  ar for all pages
13d90 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
13da0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61  his.  ** invaria
13db0 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f  nt is true..  */
13dc0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72  .  else{.    for
13dd0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
13de0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
13df0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
13e00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13e10 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
13e20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
13e30 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13e40 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46  nced==pPager->pF
13e50 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  irst );.  }.#end
13e60 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
13e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67 65 20  .}../*.** Merge 
13e80 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70 61 67  two lists of pag
13e90 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  es connected by 
13ea0 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20 70 67  pDirty and in pg
13eb0 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44 6f 20  no order..** Do 
13ec0 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e 67 20  not both fixing 
13ed0 74 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  the pPrevDirty p
13ee0 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  ointers..*/.stat
13ef0 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67 65 5f  ic PgHdr *merge_
13f00 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13f10 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29 7b 0a  pA, PgHdr *pB){.
13f20 20 20 50 67 48 64 72 20 72 65 73 75 6c 74 2c 20    PgHdr result, 
13f30 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69 6c 20  *pTail;.  pTail 
13f40 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77 68 69  = &result;.  whi
13f50 6c 65 28 20 70 41 20 26 26 20 70 42 20 29 7b 0a  le( pA && pB ){.
13f60 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67 6e 6f      if( pA->pgno
13f70 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  <pB->pgno ){.   
13f80 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13f90 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70 54 61   = pA;.      pTa
13fa0 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  il = pA;.      p
13fb0 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79 3b 0a  A = pA->pDirty;.
13fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13fd0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13fe0 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61 69 6c   pB;.      pTail
13ff0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 42 20   = pB;.      pB 
14000 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a 20 20  = pB->pDirty;.  
14010 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 41    }.  }.  if( pA
14020 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
14030 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 7d 65  Dirty = pA;.  }e
14040 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a 20 20  lse if( pB ){.  
14050 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20    pTail->pDirty 
14060 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = pB;.  }else{. 
14070 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
14080 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
14090 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72 74 79  rn result.pDirty
140a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72 74 20  ;.}../*.** Sort 
140b0 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
140c0 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f  s in accending o
140d0 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20 20 50  rder by pgno.  P
140e0 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6e 6e  ages are.** conn
140f0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
14100 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65 20 70  pointers.  The p
14110 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65  PrevDirty pointe
14120 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72 75 70  rs are.** corrup
14130 74 65 64 20 62 79 20 74 68 69 73 20 73 6f 72 74  ted by this sort
14140 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 53  ..*/.#define N_S
14150 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
14160 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f 53 4f   25.#define N_SO
14170 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20 20 20  RT_BUCKET       
14180 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  25.#ifdef SQLITE
14190 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71 6c 69  _TEST.  int sqli
141a0 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
141b0 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20 20 23  _bucket = 0;.  #
141c0 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42 55 43  undef N_SORT_BUC
141d0 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20 4e 5f  KET.  #define N_
141e0 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a 20 20  SORT_BUCKET \.  
141f0 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   (sqlite3_pager_
14200 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f 73 71  n_sort_bucket?sq
14210 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
14220 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f 52 54  rt_bucket:N_SORT
14230 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29 0a 23  _BUCKET_ALLOC).#
14240 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50 67 48  endif.static PgH
14250 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73  dr *sort_pagelis
14260 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20  t(PgHdr *pIn){. 
14270 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54   PgHdr *a[N_SORT
14280 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d 2c 20  _BUCKET_ALLOC], 
14290 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6d  *p;.  int i;.  m
142a0 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69 7a 65  emset(a, 0, size
142b0 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c 65 28  of(a));.  while(
142c0 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20 3d 20   pIn ){.    p = 
142d0 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70  pIn;.    pIn = p
142e0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 70 2d  ->pDirty;.    p-
142f0 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  >pDirty = 0;.   
14300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f 53 4f   for(i=0; i<N_SO
14310 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69 2b 2b  RT_BUCKET-1; i++
14320 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 69  ){.      if( a[i
14330 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
14340 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20 20 20  a[i] = p;.      
14350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14360 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20  else{.        p 
14370 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
14380 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 20  (a[i], p);.     
14390 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20 20 20     a[i] = 0;.   
143a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
143b0 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42 55 43  f( i==N_SORT_BUC
143c0 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20 20 2f  KET-1 ){.      /
143d0 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f 20 67  * Coverage: To g
143e0 65 74 20 68 65 72 65 2c 20 74 68 65 72 65 20 6e  et here, there n
143f0 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e 5f 53  eed to be 2^(N_S
14400 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20 20 20  ORT_BUCKET) .   
14410 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69     ** elements i
14420 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69 73 74  n the input list
14430 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73 69 62  . This is possib
14440 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63 74 69  le, but impracti
14450 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20 54 65  cal..      ** Te
14460 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e 65 20  sting this line 
14470 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f 66 20  is the point of 
14480 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 0a  global variable.
14490 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
144a0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
144b0 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cket..      */. 
144c0 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65 72 67       a[i] = merg
144d0 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
144e0 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   p);.    }.  }. 
144f0 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66 6f 72   p = a[0];.  for
14500 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42  (i=1; i<N_SORT_B
14510 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20 20 20  UCKET; i++){.   
14520 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
14530 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a 20 20  ist(p, a[i]);.  
14540 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
14550 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c  ./*.** Given a l
14560 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f  ist of pages (co
14570 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50  nnected by the P
14580 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e  gHdr.pDirty poin
14590 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76  ter) write.** ev
145a0 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ery one of those
145b0 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68   pages out to th
145c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
145d0 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c  and mark them al
145e0 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a  l.** as clean..*
145f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
14600 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
14610 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b  t(PgHdr *pList){
14620 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14630 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
14640 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
14650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14660 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
14670 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
14680 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
14690 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
146a0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
146b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
146c0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
146d0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
146e0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
146f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
14700 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
14710 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
14720 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
14730 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
14740 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
14750 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
14760 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
14770 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
14780 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
14790 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
147a0 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
147b0 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
147c0 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
147d0 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
147e0 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
147f0 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
14800 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
14810 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
14820 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
14830 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
14840 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
14850 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
14860 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
14870 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
14880 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
14890 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
148a0 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
148b0 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
148c0 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
148d0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
148e0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
148f0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
14900 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
14910 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
14920 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
14930 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
14940 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
14950 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14960 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
14970 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
14980 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
14990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
149a0 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
149b0 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
149c0 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
149d0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
149e0 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
149f0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
14a00 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
14a10 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
14a20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
14a40 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
14a50 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
14a60 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 77 68  ist(pList);.  wh
14a70 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20  ile( pList ){.  
14a80 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
14a90 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63  >dirty );.    rc
14aa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
14ab0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  (pPager->fd, (pL
14ac0 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
14ad0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
14ae0 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
14af0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
14b00 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
14b10 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
14b20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
14b30 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
14b40 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
14b50 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
14b60 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
14b70 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
14b80 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
14b90 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
14ba0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
14bb0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
14bc0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
14bd0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
14be0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
14bf0 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
14c00 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14c10 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
14c20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
14c30 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
14c40 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65  a = CODEC2(pPage
14c50 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
14c60 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
14c70 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20  pgno, 6);.      
14c80 50 41 47 45 52 54 52 41 43 45 34 28 22 53 54 4f  PAGERTRACE4("STO
14c90 52 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61  RE %d page %d ha
14ca0 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14cc0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
14cd0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 70 61   pList->pgno, pa
14ce0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
14cf0 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  st));.      IOTR
14d00 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
14d10 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
14d20 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  ist->pgno));.   
14d30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14d40 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
14d50 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
14d60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14d70 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
14d80 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
14d90 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
14da0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
14db0 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
14dc0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
14dd0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
14de0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
14df0 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
14e00 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
14e10 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
14e20 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
14e30 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
14e40 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
14e50 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
14e60 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
14e70 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
14e80 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
14e90 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
14ea0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
14eb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14ec0 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30  pList->dirty = 0
14ed0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
14ee0 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
14ef0 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20  pList->pageHash 
14f00 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
14f10 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a  (pList);.#endif.
14f20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
14f30 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
14f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14f50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
14f60 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
14f70 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
14f80 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
14f90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
14fa0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
14fb0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
14fc0 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
14fd0 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
14fe0 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
14ff0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
15000 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
15010 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
15020 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15030 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
15040 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
15050 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
15060 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
15070 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69  ournal on the gi
15080 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20  ven pager..** A 
15090 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  hot journal is o
150a0 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f  ne that needs to
150b0 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
150c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
150d0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
150e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
150f0 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e  is 0 but a journ
15100 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74  al file.** exist
15110 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61  s, that is proba
15120 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e  bly an old journ
15130 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f  al left over fro
15140 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74  m a prior.** dat
15150 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73  abase with the s
15160 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20  ame name.  Just 
15170 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
15180 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
15190 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28  t hasHotJournal(
151a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
151b0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
151c0 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
151d0 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c  rn 0;.  if( !sql
151e0 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
151f0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
15200 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  l) ){.    return
15210 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
15220 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
15230 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
15240 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  >fd) ){.    retu
15250 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
15260 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15270 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
15280 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
15290 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
152a0 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72  zJournal);.    r
152b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
152c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
152d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79    }.}../*.** Try
152e0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
152f0 69 6e 20 74 68 65 20 63 61 63 68 65 20 74 68 61  in the cache tha
15300 74 20 63 61 6e 20 62 65 20 72 65 63 79 63 6c 65  t can be recycle
15310 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  d. .**.** This r
15320 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74 75 72  outine may retur
15330 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  n SQLITE_IOERR, 
15340 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72 20 53  SQLITE_FULL or S
15350 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a  QLITE_OK. It .**
15360 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20 74 68   does not set th
15370 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  e pPager->errCod
15380 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  e variable..*/.s
15390 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
153a0 72 65 63 79 63 6c 65 28 50 61 67 65 72 20 2a 70  recycle(Pager *p
153b0 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e 63 4f  Pager, int syncO
153c0 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29  k, PgHdr **ppPg)
153d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
153e0 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20    *ppPg = 0;..  
153f0 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a  assert(!MEMDB);.
15400 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67  .  /* Find a pag
15410 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54  e to recycle.  T
15420 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ry to locate a p
15430 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  age that does no
15440 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75  t.  ** require u
15450 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63  s to do an fsync
15460 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  () on the journa
15470 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  l..  */.  pPg = 
15480 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
15490 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nced;..  /* If w
154a0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
154b0 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
154c0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
154d0 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e   fsync().  ** on
154e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
154f0 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
15500 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
15510 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76  This is a.  ** v
15520 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
15530 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
15540 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
15550 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
15560 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
15570 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20   helped..  */.  
15580 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50  if( pPg==0 && pP
15590 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26 26 20  ager->pFirst && 
155a0 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d 44 42  syncOk && !MEMDB
155b0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
155c0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
155d0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
155e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
155f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15600 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
15610 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  lSync ){.      /
15620 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
15630 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
15640 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
15650 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  er into the.    
15660 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
15670 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
15680 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
15690 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
156a0 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65  l.      ** heade
156b0 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76  r that is involv
156c0 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ed in the rollba
156d0 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ck of pages that
156e0 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61   have.      ** a
156f0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
15700 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
15710 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65  ase (in case the
15720 20 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20   header is.     
15730 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e   ** trashed when
15740 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
15750 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20  is updated)..   
15760 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67     */.      pPag
15770 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15780 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15790 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
157a0 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65   0 );.      asse
157b0 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f  rt( pPager->doNo
157c0 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  tSync==0 );.    
157d0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
157e0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
157f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
15800 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15810 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15820 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50    }.    pPg = pP
15830 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
15840 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
15850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61  ITE_OK;.  }..  a
15870 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
15880 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
15890 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
158a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
158b0 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
158c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
158d0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e  >dirty ){.    in
158e0 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
158f0 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
15900 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c  =0 );.    makeCl
15910 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50  ean(pPg);.    pP
15920 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
15930 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
15940 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
15950 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
15960 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69 66 28  ( pPg );.    if(
15970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15980 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
15990 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  c;.    }.  }.  a
159a0 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74  ssert( pPg->dirt
159b0 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  y==0 );..  /* If
159c0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
159d0 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61   recycling is ma
159e0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
159f0 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a  llback, then.  *
15a00 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
15a10 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
15a20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
15a30 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 71  ling the.  ** sq
15a40 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
15a50 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
15a60 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
15a70 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
15a80 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20  action..  ** It 
15a90 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
15aa0 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
15ab0 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
15ac0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
15ad0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c   ** might be rel
15ae0 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72  oaded at a later
15af0 20 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61   time but at tha
15b00 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74  t point we won't
15b10 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
15b20 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65  hat is was marke
15b30 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15b40 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  .  This means th
15b50 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73  at all pages mus
15b60 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64  t.  ** be marked
15b70 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
15b80 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
15b90 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  out..  */.  if( 
15ba0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
15bb0 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ack ){.    IOTRA
15bc0 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c  CE(("ALWAYS_ROLL
15bd0 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67  BACK %p\n", pPag
15be0 65 72 29 29 0a 20 20 20 20 70 50 61 67 65 72 2d  er)).    pPager-
15bf0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
15c00 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  = 1;.  }..  /* U
15c10 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
15c20 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
15c30 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
15c40 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20  sh table.  */.  
15c50 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
15c60 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
15c70 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70  pgno==0 );..  *p
15c80 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  pPg = pPg;.  ret
15c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
15cb0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
15cc0 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c 75  to free superflu
15cd0 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20  ous dynamically 
15ce0 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79  allocated memory
15cf0 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20  .** held by the 
15d00 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65  pager system. Me
15d10 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20 61  mory in use by a
15d20 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72 20  ny SQLite pager 
15d30 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
15d40 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15d50 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65  ad may be sqlite
15d60 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  Free()ed..**.** 
15d70 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
15d80 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
15d90 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
15da0 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
15db0 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
15dc0 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
15dd0 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e 65 67  n returns. A neg
15de0 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f 72 20  ative value for 
15df0 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20 66 72  nReq means.** fr
15e00 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72  ee as much memor
15e10 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 20 54  y as possible. T
15e20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
15e30 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
15e40 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73  ber .** of bytes
15e50 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61   of memory relea
15e60 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  sed..*/.#if defi
15e70 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
15e80 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
15e90 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  ENT) && !defined
15ea0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
15eb0 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69 74 65 33  KIO).int sqlite3
15ec0 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f  PagerReleaseMemo
15ed0 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20  ry(int nReq){.  
15ee0 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74 61  const ThreadData
15ef0 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69 74   *pTsdro = sqlit
15f00 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61 64  e3ThreadDataRead
15f10 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20 6e 52  Only();.  int nR
15f20 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69  eleased = 0;.  i
15f30 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt i;..  /* If t
15f40 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  he the global mu
15f50 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69  tex is held, thi
15f60 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  s subroutine bec
15f70 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70  omes a.  ** o-op
15f80 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20  ; zero bytes of 
15f90 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64  memory are freed
15fa0 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
15fb0 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20  se.  ** some of 
15fc0 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64  the code invoked
15fd0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15fe0 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20  n may also.  ** 
15ff0 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  try to obtain th
16000 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69  e mutex, resulti
16010 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b  ng in a deadlock
16020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
16030 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29  ite3OsInMutex(0)
16040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16050 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65  ;.  }..  /* Oute
16060 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20  rmost loop runs 
16070 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20  for at most two 
16080 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73  iterations. Firs
16090 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20  t iteration we. 
160a0 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20   ** try to find 
160b0 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
160c0 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
160d0 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e  out calling fsyn
160e0 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a  c(). Second.  **
160f0 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63   iteration (whic
16100 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74  h only runs if t
16110 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20  he first failed 
16120 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74  to free nReq byt
16130 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72  es of.  ** memor
16140 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  y) is permitted 
16150 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e  to call fsync().
16160 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72   This is of cour
16170 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20  se much more .  
16180 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20  ** expensive..  
16190 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
161a0 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f  =1; i++){..    /
161b0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
161c0 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61  ll the SQLite pa
161d0 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74  gers opened by t
161e0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
161f0 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65 72 20  d. */.    Pager 
16200 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64 72 6f  *pPager = pTsdro
16210 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 66 6f  ->pPager;.    fo
16220 72 28 20 3b 20 70 50 61 67 65 72 20 26 26 20 28  r( ; pPager && (
16230 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c 65 61  nReq<0 || nRelea
16240 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61 67 65  sed<nReq); pPage
16250 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29  r=pPager->pNext)
16260 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
16270 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  Pg;.      int rc
16280 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  ;..      if( MEM
16290 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  DB ){.        co
162a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
162b0 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61  .      /* For ea
162c0 63 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f  ch pager, try to
162d0 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61   free as many pa
162e0 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  ges as possible 
162f0 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20  (without .      
16300 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63  ** calling fsync
16310 28 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68  () if this is th
16320 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
16330 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f  n of the outermo
16340 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  st .      ** loo
16350 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  p)..      */.   
16360 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45     while( SQLITE
16370 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72  _OK==(rc = pager
16380 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
16390 20 69 2c 20 26 70 50 67 29 29 20 26 26 20 70 50   i, &pPg)) && pP
163a0 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  g) {.        /* 
163b0 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61  We've found a pa
163c0 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74  ge to free. At t
163d0 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61  his point the pa
163e0 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20  ge has been .   
163f0 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20       ** removed 
16400 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61  from the page ha
16410 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c  sh-table, free-l
16420 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c  ist and synced-l
16430 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ist .        ** 
16440 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
16450 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
16460 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
16470 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
16480 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
16490 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
164a0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
164b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
164c0 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b    ** Todo: Check
164d0 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74   the Pager.pStmt
164e0 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75   list to make su
164f0 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49  re this is Ok. I
16500 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  t .        ** pr
16510 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68  obably is though
16520 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
16530 20 20 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70       PgHdr *pTmp
16540 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16550 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
16560 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
16570 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
16580 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
16590 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
165a0 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  l;.        }else
165b0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
165c0 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41   pTmp=pPager->pA
165d0 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41  ll; pTmp->pNextA
165e0 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54  ll!=pPg; pTmp=pT
165f0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d  mp->pNextAll ){}
16600 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d  .          pTmp-
16610 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d  >pNextAll = pPg-
16620 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
16630 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65     }.        nRe
16640 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65  leased += sqlite
16650 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a  AllocSize(pPg);.
16660 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
16670 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
16680 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
16690 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  pgno));.        
166a0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
166b0 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
166c0 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
166d0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
166e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
166f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16700 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  K ){.        /* 
16710 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
16720 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
16730 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16740 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20  file or .       
16750 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70   ** journal in p
16760 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20  ager_recycle(). 
16770 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  The error is not
16780 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
16790 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c   .        ** cal
167a0 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ler of this func
167b0 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73  tion. Instead, s
167c0 65 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72  et the Pager.err
167d0 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20  Code variable.. 
167e0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72         ** The er
167f0 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75  ror will be retu
16800 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
16810 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74   (or users, in t
16820 68 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20  he case .       
16830 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20   ** of a shared 
16840 70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20  pager cache) of 
16850 74 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68  the pager for wh
16860 69 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63  ich the error oc
16870 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  cured..        *
16880 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
16890 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
168a0 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72 63 3d  ITE_IOERR || rc=
168b0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a  =SQLITE_FULL );.
168c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
168d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
168e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
168f0 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 65  .        pager_e
16900 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16920 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52    }..  return nR
16930 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69  eleased;.}.#endi
16940 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
16950 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
16960 4d 45 4e 54 20 26 26 20 21 53 51 4c 49 54 45 5f  MENT && !SQLITE_
16970 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 0a  OMIT_DISKIO */..
16980 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63  /*.** Read the c
16990 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70  ontent of page p
169a0 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61  Pg out of the da
169b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
169c0 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44  static int readD
169d0 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  bPage(Pager *pPa
169e0 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c  ger, PgHdr *pPg,
169f0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
16a00 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
16a10 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 72   MEMDB==0 );.  r
16a20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
16a30 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
16a40 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
16a50 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16a60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16a70 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
16a80 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
16a90 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54  ger->fd, PGHDR_T
16aa0 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20  O_DATA(pPg),.   
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
16ad0 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
16ae0 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
16af0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
16b00 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
16b10 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
16b20 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
16b30 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
16b40 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
16b50 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
16b60 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
16b70 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
16b80 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
16b90 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
16ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
16bd0 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
16be0 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
16bf0 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
16c00 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16c10 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
16c20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
16c30 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
16c40 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
16c50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16c60 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
16c70 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
16c80 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
16c90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16ca0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
16cb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16cc0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
16cd0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
16ce0 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
16cf0 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
16d00 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
16d10 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
16d20 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
16d30 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
16d40 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
16d50 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
16d60 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
16d70 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
16d80 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
16d90 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
16da0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
16db0 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
16dc0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
16dd0 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
16de0 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
16df0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
16e00 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
16e10 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
16e20 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
16e30 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
16e40 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
16e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
16e60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
16e70 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
16e80 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
16e90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16ea0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
16eb0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
16ec0 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
16ed0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  k ){.        rc 
16ee0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16ef0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
16f00 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
16f10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16f30 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16f40 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16f60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16f70 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
16f80 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
16f90 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
16fa0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
16fb0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
16fc0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
16fd0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
16fe0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
16ff0 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
17000 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
17010 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
17020 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  eleted..      */
17030 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f  .      if( hasHo
17040 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
17050 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   ){.        /* G
17060 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
17070 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
17080 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
17090 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
170a0 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
170b0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
170c0 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
170d0 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
170e0 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
170f0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
17100 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
17110 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
17120 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
17130 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
17140 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
17150 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
17160 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
17170 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
17180 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
17190 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
171a0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
171b0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
171c0 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ng it .        *
171d0 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  * back..        
171e0 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42  ** .        ** B
171f0 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
17200 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
17210 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
17220 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
17230 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
17240 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
17250 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
17260 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
17270 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  l to.        ** 
17280 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
17290 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
172a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
172b0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
172c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
172d0 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
172e0 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
172f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
17300 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17310 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
17320 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
17330 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
17340 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
17350 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
17360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17370 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17380 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
17390 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;. .        /* O
173a0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
173b0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
173c0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
173d0 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
173e0 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
173f0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
17400 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
17410 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
17420 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
17430 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
17440 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
17450 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
17460 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
17470 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
17480 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
17490 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
174a0 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
174b0 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
174c0 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
174d0 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
174e0 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
174f0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
17500 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
17510 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
17520 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
17530 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  ..** Open the jo
17540 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
17550 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
17560 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
17570 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61  ..** exclusive-a
17580 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
17590 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
175a0 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
175b0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
175c0 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
175d0 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
175e0 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
175f0 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
17600 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
17610 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
17620 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
17630 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
17640 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
17650 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
17660 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
17670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17680 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17690 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
176a0 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
176b0 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
176c0 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
176d0 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20   int ro;.       
176e0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
176f0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
17700 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
17710 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
17720 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  Write(pPager->zJ
17730 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
17740 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20  >jfd, &ro);.    
17750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
17760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
17770 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20  Pager->jfd );.  
17780 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 20 29          if( ro )
17790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
177a0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
177b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
177c0 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
177d0 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
177e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
177f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17810 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c         pager_unl
17820 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
17830 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17840 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
17850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
17860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17870 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50   = 1;.        pP
17880 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
17890 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
178a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
178b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
178c0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
178d0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
178e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
178f0 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20  Hdr = 0;. .     
17900 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
17910 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
17920 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
17930 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
17940 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20          ** lock 
17950 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68  and reacquire th
17960 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20  e read lock..   
17970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17980 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
17990 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a  ack(pPager, 1);.
179a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
179b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
179c0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61         return pa
179d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
179e0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  , rc);.        }
179f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17a00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
17a10 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a  AGER_SHARED || .
17a20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 50 61              (pPa
17a30 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
17a40 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  de && pPager->st
17a50 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44  ate>PAGER_SHARED
17a60 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
17a70 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
17a80 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a  pPager->pAll ){.
17a90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17aa0 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a  hared-lock has j
17ab0 75 73 74 20 62 65 65 6e 20 61 63 71 75 69 72 65  ust been acquire
17ac0 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
17ad0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a  e file.        *
17ae0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
17af0 61 6c 72 65 61 64 79 20 70 61 67 65 73 20 69 6e  already pages in
17b00 20 74 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d   the cache (from
17b10 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
17b20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
17b30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
17b40 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
17b50 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
17b60 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20  .        ** has 
17b70 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20  been modified.  
17b80 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
17b90 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75  has changed, flu
17ba0 73 68 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  sh the.        *
17bb0 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20  * cache..       
17bc0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   **.        ** D
17bd0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 20  atabase changes 
17be0 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20 6c  is detected by l
17bf0 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74  ooking at 15 byt
17c00 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20  es beginning.   
17c10 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
17c20 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69  t 24 into the fi
17c30 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34  le.  The first 4
17c40 20 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74   of these 16 byt
17c50 65 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a  es are.        *
17c60 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74  * a 32-bit count
17c70 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65  er that is incre
17c80 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68  mented with each
17c90 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20   change.  The.  
17ca0 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62        ** other b
17cb0 79 74 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64  ytes change rand
17cc0 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68 20 66  omly with each f
17cd0 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a  ile change when.
17ce0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64          ** a cod
17cf0 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
17d00 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
17d10 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
17d20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c  vanishingly smal
17d30 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20  l chance that a 
17d40 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20  change will not 
17d50 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  be .        ** d
17d60 65 74 65 63 74 65 64 2e 20 20 54 68 65 20 63 68  etected.  The ch
17d70 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74  ance of an undet
17d80 65 63 74 65 64 20 63 68 61 6e 67 65 20 69 73 20  ected change is 
17d90 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20  so small that.  
17da0 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20        ** it can 
17db0 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20  be neglected..  
17dc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17dd0 20 63 68 61 72 20 64 62 46 69 6c 65 56 65 72 73   char dbFileVers
17de0 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  [sizeof(pPager->
17df0 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20  dbFileVers)];.  
17e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17e10 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
17e20 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  er);..        if
17e30 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17e40 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
17e50 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
17e60 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d  rCode;.        }
17e70 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ..        if( pP
17e80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29  ager->dbSize>0 )
17e90 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  {.          IOTR
17ea0 41 43 45 28 28 22 43 4b 56 45 52 53 20 25 70 20  ACE(("CKVERS %p 
17eb0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73  %d\n", pPager, s
17ec0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
17ed0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  )));.          r
17ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
17ef0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 32 34  k(pPager->fd, 24
17f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
17f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17f20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
17f30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17f40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
17f50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
17f60 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64  d(pPager->fd, &d
17f70 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
17f80 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  f(dbFileVers));.
17f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
17fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fb0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
17fc0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
17fd0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
17fe0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65  .          memse
17ff0 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
18000 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
18010 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rs));.        }.
18020 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d  .        if( mem
18030 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46 69  cmp(pPager->dbFi
18040 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56 65  leVers, dbFileVe
18050 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
18060 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20 20  eVers))!=0 ){.  
18070 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
18080 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
18090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
180a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
180b0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
180c0 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
180d0 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53  ->state<=PAGER_S
180e0 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
180f0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
18100 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
18110 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
18120 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
18130 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ED;.    }.  }.. 
18140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18150 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
18160 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20  PgHdr object.   
18170 45 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20  Either create a 
18180 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65  new one or reuse
18190 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20  .** an existing 
181a0 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20  one that is not 
181b0 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65  otherwise in use
181c0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67  ..**.** A new Pg
181d0 48 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73  Hdr structure is
181e0 20 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20   created if any 
181f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
18200 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a   are.** true:.**
18210 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20  .**     (1)  We 
18220 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65  have not exceede
18230 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c  d our maximum al
18240 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69  located cache si
18250 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
18260 73 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52  s set by the "PR
18270 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22  AGMA cache_size"
18280 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
18290 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61      (2)  There a
182a0 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48  re no unused PgH
182b0 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c  dr objects avail
182c0 61 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d  able at this tim
182d0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29  e..**.**     (3)
182e0 20 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d    This is an in-
182f0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
18300 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  .**.**     (4)  
18310 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48  There are no PgH
18320 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  dr objects that 
18330 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  do not require a
18340 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
18350 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61       file sync a
18360 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65  nd a sync of the
18370 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
18380 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20   currently.**   
18390 20 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65         prohibite
183a0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  d..**.** Otherwi
183b0 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69  se, reuse an exi
183c0 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e  sting PgHdr.  In
183d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
183e0 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69  use an.** existi
183f0 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20  ng PgHdr if all 
18400 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
18410 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
18420 20 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76       (1)  We hav
18430 65 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63  e reached or exc
18440 65 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75  eeded the maximu
18450 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20  m cache size.** 
18460 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
18470 20 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68   by "PRAGMA cach
18480 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20  e_size"..**.**  
18490 20 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73     (2)  There is
184a0 20 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62   a PgHdr availab
184b0 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e  le with PgHdr->n
184c0 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20  Ref==0.**.**    
184d0 20 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74   (3)  We are not
184e0 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   in an in-memory
184f0 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20   database.**.** 
18500 20 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20      (4)  Either 
18510 74 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69  there is an avai
18520 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74  lable PgHdr that
18530 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a   does not need.*
18540 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65  *          to be
18550 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
18560 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e  or else disk syn
18570 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c  cing is currentl
18580 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c  y.**          al
18590 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  lowed..*/.static
185a0 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61   int pagerAlloca
185b0 74 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  tePage(Pager *pP
185c0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70  ager, PgHdr **pp
185d0 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Pg){.  int rc = 
185e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48  SQLITE_OK;.  PgH
185f0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 43  dr *pPg;..  /* C
18600 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64  reate a new PgHd
18610 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  r if any of the 
18620 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  four conditions 
18630 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62  defined .  ** ab
18640 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f 0a 20  ove is met: */. 
18650 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
18660 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
18670 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e.   || pPager->
18680 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c  pFirst==0 .   ||
18690 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50   MEMDB.   || (pP
186a0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
186b0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
186c0 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 29 7b  >doNotSync).  ){
186d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
186e0 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e  >nPage>=pPager->
186f0 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 70  nHash ){.      p
18700 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
18710 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20  _table(pPager,. 
18720 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18730 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36 20  nHash<256 ? 256 
18740 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2a  : pPager->nHash*
18750 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  2);.      if( pP
18760 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30 20 29  ager->nHash==0 )
18770 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
18780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
18790 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
187a0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
187b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
187c0 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
187d0 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
187e0 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
187f0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
18820 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
18830 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
18840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
18850 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
18860 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 69  istory) );.    i
18870 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
18880 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
18890 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
188a0 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
188b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
188c0 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69  emset(pPg, 0, si
188d0 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20  zeof(*pPg));.   
188e0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
188f0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
18900 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
18910 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
18920 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
18930 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
18940 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
18950 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
18960 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
18970 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c      pPager->pAll
18980 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67   = pPg;.    pPag
18990 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d  er->nPage++;.  }
189a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63  else{.    /* Rec
189b0 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67  ycle an existing
189c0 20 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72   page with a zer
189d0 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a  o ref-count. */.
189e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
189f0 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
18a00 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28  , &pPg);.    if(
18a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
18a20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18a30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
18a40 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KED;.    }.    i
18a50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18a60 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
18a70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
18a80 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  t;.    }.    ass
18a90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
18aa0 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
18ab0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50  );.    assert(pP
18ac0 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 67 20  g);.  }.  *ppPg 
18ad0 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f 61 6c  = pPg;..pager_al
18ae0 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20 72 65  locate_out:.  re
18af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18b00 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
18b10 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ave the content 
18b20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49 66 20  for a page.  If 
18b30 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20  the page was.** 
18b40 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69  previously acqui
18b50 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65  red with noConte
18b60 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  nt==1, then the 
18b70 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a 20 6a  content was.** j
18b80 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  ust initialized 
18b90 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65 61 64  to zeros instead
18ba0 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64 20 66   of being read f
18bb0 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42 75 74  rom disk..** But
18bc0 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74 68 65   now we need the
18bd0 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66 20 6f   real data off o
18be0 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61 6b 65  f disk.  So make
18bf0 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61 76 65   sure we.** have
18c00 20 69 74 2e 20 20 52 65 61 64 20 69 74 20 69 6e   it.  Read it in
18c10 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20 68 61   if we do not ha
18c20 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e 0a 2a  ve it already..*
18c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
18c40 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 50  er_get_content(P
18c50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
18c60 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20  ( pPg->needRead 
18c70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
18c80 72 65 61 64 44 62 50 61 67 65 28 70 50 67 2d 3e  readDbPage(pPg->
18c90 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 50 67  pPager, pPg, pPg
18ca0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  ->pgno);.    if(
18cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18cc0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  {.      pPg->nee
18cd0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
18ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
18cf0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
18d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  _OK;.}../*.** Ac
18d20 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
18d30 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
18d40 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
18d50 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
18d60 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
18d70 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
18d80 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
18d90 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
18da0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
18db0 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
18dc0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
18dd0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
18de0 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
18df0 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
18e00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
18e10 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
18e20 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
18e30 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
18e40 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
18e50 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
18e60 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
18e70 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
18e80 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
18e90 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
18ea0 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
18eb0 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
18ec0 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
18ed0 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
18ee0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
18ef0 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
18f00 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
18f10 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
18f20 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
18f30 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
18f40 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
18f50 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
18f60 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
18f70 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
18f80 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
18f90 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
18fa0 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65  also sqlite3Page
18fb0 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68  rLookup().  Both
18fc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
18fd0 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d  d Lookup() attem
18fe0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
18ff0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
19000 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
19010 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
19020 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
19030 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
19040 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
19050 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
19060 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f  t in whereas Loo
19070 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
19080 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
19090 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
190a0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
190b0 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
190c0 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
190d0 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
190e0 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
190f0 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
19100 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
19110 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72  e Lookup() never
19120 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
19130 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
19140 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
19150 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
19160 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43  es..**.** If noC
19170 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  ontent is false,
19180 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
19190 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
191a0 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
191b0 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e 74 20  ** If noContent 
191c0 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e  is true, it mean
191d0 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  s that we do not
191e0 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
191f0 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 74  contents.** of t
19200 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
19210 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 20  time, so do not 
19220 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64 2e 20  do a disk read. 
19230 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
19240 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e  e.** page conten
19250 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20 20 42  t with zeros.  B
19260 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61 63 74  ut mark the fact
19270 20 74 68 61 74 20 77 65 20 68 61 76 65 20 6e 6f   that we have no
19280 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20 63 6f  t read the.** co
19290 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69 6e 67  ntent by setting
192a0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 52   the PgHdr.needR
192b0 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74 65 72  ead flag.  Later
192c0 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71 6c 69   on, if .** sqli
192d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
192e0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  is called on thi
192f0 73 20 70 61 67 65 20 6f 72 20 69 66 20 74 68 69  s page or if thi
19300 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
19310 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77 69 74  called again wit
19320 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20  h noContent==0, 
19330 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20  that means that 
19340 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  the content is n
19350 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  eeded.** and the
19360 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f 75 6c   disk read shoul
19370 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
19380 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
19390 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
193a0 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e(.  Pager *pPag
193b0 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
193c0 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68  pager open on th
193d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
193e0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
193f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
19400 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68   number to fetch
19410 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70   */.  DbPage **p
19420 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69  pPage,    /* Wri
19430 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  te a pointer to 
19440 74 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f  the page here */
19450 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
19460 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
19470 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20   bother reading 
19480 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
19490 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  k if true */.){.
194a0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
194b0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
194c0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
194d0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c  ==PAGER_UNLOCK |
194e0 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30  | pPager->nRef>0
194f0 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a   || pgno==1 );..
19500 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
19510 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
19520 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c  2^31. Return SQL
19530 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
19540 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65   page.  ** numbe
19550 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
19560 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73  his, or zero, is
19570 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
19580 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45  .  if( pgno>PAGE
19590 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67  R_MAX_PGNO || pg
195a0 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50  no==0 || pgno==P
195b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
195c0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ger) ){.    retu
195d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
195e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
195f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68  * Make sure we h
19600 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20  ave not hit any 
19610 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e  critical errors.
19620 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28  .  */ .  assert(
19630 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
19640 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  *ppPage = 0;.  i
19650 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19660 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
19670 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
19680 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
19690 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
196a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
196b0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
196c0 20 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20   page accessed, 
196d0 74 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45  then get a SHARE
196e0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74  D lock.  ** on t
196f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19700 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  . pagerSharedLoc
19710 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  k() is a no-op i
19720 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61  f .  ** a databa
19730 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  se lock is alrea
19740 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20  dy held..  */.  
19750 72 63 20 3d 20 70 61 67 65 72 53 68 61 72 65 64  rc = pagerShared
19760 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  Lock(pPager);.  
19770 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19780 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
19790 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
197a0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
197b0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
197c0 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  ..  pPg = pager_
197d0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
197e0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
197f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
19800 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
19810 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
19820 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
19830 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20 20 69   int nMax;.    i
19840 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45 52 5f  nt h;.    PAGER_
19850 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69  INCR(pPager->nMi
19860 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  ss);.    rc = pa
19870 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67 65 28  gerAllocatePage(
19880 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20  pPager, &pPg);. 
19890 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
198a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
198b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
198c0 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20      pPg->pgno = 
198d0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
198e0 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67 6e 6f  ( !MEMDB || pgno
198f0 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  >pPager->stmtSiz
19900 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  e );.    if( pPa
19910 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19920 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
19930 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
19940 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
19950 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
19960 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
19970 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20   pgno/8);.      
19980 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
19990 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
199a0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
199b0 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
199c0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
199d0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
199e0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
199f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
19a00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19a10 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
19a20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
19a30 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
19a40 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65    }..    makeCle
19a50 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
19a60 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
19a70 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20  REFINFO(pPg);.. 
19a80 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b     pPager->nRef+
19a90 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
19aa0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
19ab0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
19ac0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
19ad0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
19ae0 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
19af0 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71   }.    nMax = sq
19b00 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19b10 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
19b20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19b30 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Code ){.      sq
19b40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
19b50 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pPg);.      rc =
19b60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19b70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
19b80 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
19b90 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61   Populate the pa
19ba0 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69  ge with data, ei
19bb0 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20  ther by reading 
19bc0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19bd0 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f  e.    ** file, o
19be0 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  r by setting the
19bf0 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20   entire page to 
19c00 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
19c10 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70   if( nMax<(int)p
19c20 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  gno || MEMDB || 
19c30 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70  (noContent && !p
19c40 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
19c50 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  lback) ){.      
19c60 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d  if( pgno>pPager-
19c70 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  >mxPgno ){.     
19c80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
19c90 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
19ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19cb0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _FULL;.      }. 
19cc0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
19cd0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
19ce0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
19cf0 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  ize);.      pPg-
19d00 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f  >needRead = noCo
19d10 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72  ntent && !pPager
19d20 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
19d30 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
19d40 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c  ("ZERO %p %d\n",
19d50 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b   pPager, pgno));
19d60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19d70 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61 67    rc = readDbPag
19d80 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  e(pPager, pPg, p
19d90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
19da0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
19db0 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc!=SQLITE_IOER
19dc0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
19dd0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e          pPg->pgn
19de0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  o = 0;.        s
19df0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
19e00 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
19e10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19e20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  }.      pPg->nee
19e30 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  dRead = 0;.    }
19e40 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
19e50 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
19e60 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
19e70 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
19e80 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
19e90 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
19ea0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
19eb0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
19ec0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
19ed0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
19ee0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
19ef0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
19f00 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
19f10 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
19f20 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
19f30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
19f40 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
19f50 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
19f60 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
19f70 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
19f80 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
19f90 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
19fa0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
19fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
19fc0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
19fd0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
19fe0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
19ff0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
1a000 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
1a010 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
1a020 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a  (pPager->nHit);.
1a030 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65      if( !noConte
1a040 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
1a050 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
1a060 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  nt(pPg);.      i
1a070 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1a080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a090 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61    }.    }.    pa
1a0a0 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1a0b0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67  .  *ppPage = pPg
1a0c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a0d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
1a0e0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
1a0f0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
1a100 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1a110 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
1a120 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
1a130 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
1a140 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1a150 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
1a160 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
1a170 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
1a180 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1a190 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
1a1a0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
1a1b0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
1a1c0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
1a1d0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
1a1e0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
1a1f0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
1a200 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
1a210 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
1a220 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1a230 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
1a240 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1a250 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1a260 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1a270 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
1a280 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
1a290 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
1a2a0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
1a2b0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
1a2c0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
1a2d0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1a2e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1a2f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1a300 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a310 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66  pgno!=0 );..  if
1a320 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1a330 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1a340 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
1a350 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
1a360 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
1a370 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ode );.    retur
1a380 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 0;.  }.  if( p
1a390 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1a3a0 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1a3b0 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1a3c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1a3d0 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65    }.  pPg = page
1a3e0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1a3f0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1a400 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
1a410 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
1a420 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a  ;.  return pPg;.
1a430 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
1a440 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
1a450 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1a460 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
1a470 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
1a480 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
1a490 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
1a4a0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
1a4b0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
1a4c0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
1a4d0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
1a4e0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
1a4f0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
1a500 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a510 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
1a520 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1a530 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
1a540 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65   *pPg){..  /* De
1a550 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1a560 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1a570 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
1a580 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1a590 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
1a5a0 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
1a5b0 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
1a5c0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
1a5d0 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
1a5e0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1a5f0 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
1a600 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
1a610 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
1a620 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
1a630 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
1a640 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
1a650 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
1a660 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
1a670 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1a680 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
1a690 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
1a6a0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
1a6b0 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
1a6c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
1a6d0 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
1a6e0 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
1a6f0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1a700 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
1a710 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
1a720 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
1a730 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
1a740 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a750 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
1a760 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
1a770 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
1a780 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
1a790 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
1a7a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a7b0 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
1a7c0 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
1a7d0 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
1a7e0 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
1a7f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
1a800 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c  .    /* When all
1a810 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65   pages reach the
1a820 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20   freelist, drop 
1a830 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72  the read lock fr
1a840 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  om.    ** the da
1a850 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
1a860 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1a870 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65  nRef--;.    asse
1a880 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  rt( pPager->nRef
1a890 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  >=0 );.    if( p
1a8a0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
1a8b0 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c  & (!pPager->excl
1a8c0 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61  usiveMode || pPa
1a8d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e  ger->journalOff>
1a8e0 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  0) ){.      page
1a8f0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
1a900 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1a910 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1a920 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1a930 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
1a940 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
1a950 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
1a960 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
1a970 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
1a980 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1a990 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a9a0 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
1a9b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
1a9c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1a9d0 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
1a9e0 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
1a9f0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
1aa00 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
1aa10 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
1aa20 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
1aa30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aa40 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1aa50 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1aa60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
1aa70 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
1aa80 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1aa90 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1aaa0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
1aab0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1aac0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
1aad0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1aae0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1aaf0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ab00 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1ab10 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
1ab20 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
1ab30 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  r);.  pPager->aI
1ab40 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  nJournal = sqlit
1ab50 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
1ab60 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
1ab70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1ab80 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a  InJournal==0 ){.
1ab90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aba0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
1abb0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1abc0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63  ournal;.  }.  rc
1abd0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
1abe0 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65 72  Exclusive(pPager
1abf0 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
1ac00 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20  ger->jfd,.      
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1ac30 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
1ac40 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1ac50 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1ac60 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67 65 72  >jfd );.  pPager
1ac70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
1ac80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  ;.  pPager->setM
1ac90 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61  aster = 0;.  pPa
1aca0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1acb0 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  = 0;.  if( rc!=S
1acc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1acd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
1ace0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71  OMEM ){.      sq
1acf0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
1ad00 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
1ad10 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
1ad20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
1ad30 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71  ournal;.  }.  sq
1ad40 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79  lite3OsSetFullSy
1ad50 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
1ad60 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
1ad70 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  nc);.  sqlite3Os
1ad80 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67  SetFullSync(pPag
1ad90 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
1ada0 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73  full_fsync);.  s
1adb0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
1adc0 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  ctory(pPager->jf
1add0 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  d, pPager->zDire
1ade0 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72  ctory);.  pPager
1adf0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
1ae00 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
1ae10 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1ae20 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
1ae30 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
1ae40 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
1ae50 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
1ae60 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
1ae70 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ae80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
1ae90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1aea0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
1aeb0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
1aec0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
1aed0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
1aee0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
1aef0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
1af00 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
1af10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
1af20 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
1af30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1af40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1af50 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72  StmtBegin(pPager
1af60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1af70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
1af80 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
1af90 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
1afa0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
1afb0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
1afc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1afd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1afe0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
1aff0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1b000 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  ;..failed_to_ope
1b010 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c  n_journal:.  sql
1b020 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
1b030 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70  aInJournal);.  p
1b040 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b050 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  l = 0;.  return 
1b060 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
1b070 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
1b080 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b090 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
1b0a0 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
1b0b0 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
1b0c0 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
1b0d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
1b0e0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1b0f0 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c  aseTwo() is call
1b100 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
1b110 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1b120 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
1b130 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
1b140 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  erClose() is cal
1b150 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
1b160 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1b170 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e   is called to on
1b180 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69   every outstandi
1b190 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ng page..**.** T
1b1a0 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
1b1b0 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  er to this routi
1b1c0 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ne is a pointer 
1b1d0 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65  to any open page
1b1e0 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
1b1f0 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69  ase file.  Nothi
1b200 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74  ng changes about
1b210 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69   the page - it i
1b220 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f  s used merely to
1b230 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f  .** acquire a po
1b240 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
1b250 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
1b260 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74   as proof that t
1b270 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61  here is.** alrea
1b280 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  dy a read-lock o
1b290 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
1b2a0 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  **.** The second
1b2b0 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63   parameter indic
1b2c0 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70  ates how much sp
1b2d0 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20  ace in bytes to 
1b2e0 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a  reserve for a.**
1b2f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b300 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65  file-name at the
1b310 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
1b320 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73  urnal when it is
1b330 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   created..**.** 
1b340 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  A journal file i
1b350 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73  s opened if this
1b360 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72   is not a tempor
1b370 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74  ary file.  For t
1b380 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65  emporary.** file
1b390 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f  s, the opening o
1b3a0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1b3b0 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75  le is deferred u
1b3c0 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e  ntil there is an
1b3d0 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20  .** actual need 
1b3e0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1b3f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49  journal..**.** I
1b400 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
1b410 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76  s already reserv
1b420 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20  ed for writing, 
1b430 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b440 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1b450 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65  f exFlag is true
1b460 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67  , go ahead and g
1b470 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
1b480 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
1b490 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
1b4a0 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69  instead of waiti
1b4b0 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20  ng until we try 
1b4c0 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63  to flush the cac
1b4d0 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c  he.  The.** exFl
1b4e0 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66  ag is ignored if
1b4f0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
1b500 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
1b510 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b520 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61 67  PagerBegin(DbPag
1b530 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c  e *pPg, int exFl
1b540 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  ag){.  Pager *pP
1b550 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1b560 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
1b570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
1b580 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1b590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1b5a0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
1b5b0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66  R_UNLOCK );.  if
1b5c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1b5d0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 7b  =PAGER_SHARED ){
1b5e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b5f0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
1b600 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d 45  =0 );.    if( ME
1b610 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50 61  MDB ){.      pPa
1b620 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1b630 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
1b640 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1b650 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1b660 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c  >dbSize;.    }el
1b670 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
1b680 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
1b690 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
1b6a0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
1b6b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
1b6d0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1b6e0 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20  R_RESERVED;.    
1b6f0 20 20 20 20 69 66 28 20 65 78 46 6c 61 67 20 29      if( exFlag )
1b700 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1b710 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1b720 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
1b730 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
1b740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b750 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b780 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
1b790 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1b7a0 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
1b7b0 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
1b7c0 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1b7d0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1b7e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
1b7f0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
1b800 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
1b810 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1b820 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1b830 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d  pPager);.      }
1b840 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1b850 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1b860 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1b870 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20  ->journalOff==0 
1b880 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
1b890 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20  appens when the 
1b8a0 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63  pager was in exc
1b8b0 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f  lusive-access mo
1b8c0 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74  de last.    ** t
1b8d0 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77  ime a (read or w
1b8e0 72 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f  rite) transactio
1b8f0 6e 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  n was successful
1b900 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20  ly concluded.   
1b910 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e   ** by this conn
1b920 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20  ection. Instead 
1b930 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  of deleting the 
1b940 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20  journal file it 
1b950 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74  was .    ** kept
1b960 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e 63 61   open and trunca
1b970 74 65 64 20 74 6f 20 30 20 62 79 74 65 73 2e 0a  ted to 0 bytes..
1b980 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b990 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d  t( pPager->nRec=
1b9a0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1b9b0 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
1b9c0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
1b9d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1b9e0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
1b9f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ba00 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1ba10 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1ba20 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
1ba30 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1ba40 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1ba50 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1ba60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b  r->aInJournal ){
1ba70 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ba80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1ba90 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
1baa0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
1bab0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1bac0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1bad0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
1bae0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
1baf0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1bb00 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1bb10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1bb20 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
1bb30 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
1bb40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
1bb50 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
1bb60 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
1bb70 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
1bb80 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
1bb90 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
1bba0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
1bbb0 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
1bbc0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
1bbd0 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
1bbe0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1bbf0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
1bc00 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
1bc10 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
1bc20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
1bc30 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1bc40 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
1bc50 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
1bc60 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
1bc70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
1bc80 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
1bc90 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1bca0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
1bcb0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1bcc0 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
1bcd0 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
1bce0 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
1bcf0 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
1bd00 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1bd10 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
1bd20 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
1bd30 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1bd40 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
1bd50 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1bd60 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
1bd70 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
1bd80 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1bd90 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b  pPg->pPrevDirty;
1bda0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1bdb0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29  Pg->pPrevDirty )
1bdc0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
1bdd0 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
1bde0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1bdf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1be00 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
1be10 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1be20 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  y;.    }.  }.}..
1be30 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1be40 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1be50 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1be60 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1be70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1be80 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1be90 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1bea0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1beb0 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1bec0 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1bed0 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1bee0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1bef0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1bf00 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1bf10 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1bf20 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1bf30 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1bf40 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1bf50 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1bf60 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1bf70 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1bf80 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1bf90 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1bfa0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1bfb0 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1bfc0 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1bfd0 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1bfe0 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1bff0 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1c000 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1c010 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1c020 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1c030 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1c040 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1c050 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1c060 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1c070 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1c080 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1c090 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c0a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1c0b0 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1c0c0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1c0d0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1c0e0 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1c0f0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1c100 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1c110 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1c120 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1c130 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1c140 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1c150 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1c160 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1c170 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1c180 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1c190 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
1c1a0 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20  A(pPg);.  Pager 
1c1b0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1c1c0 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1c1d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1c1e0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1c1f0 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1c200 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1c210 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1c220 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1c230 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1c240 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1c250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1c260 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1c270 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1c280 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1c290 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1c2a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
1c2b0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1c2c0 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1c2d0 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61 74  Content==1, that
1c2e0 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20 64   means.  ** we d
1c2f0 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65 61  idn't really rea
1c300 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  d in the content
1c310 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 54   of the page.  T
1c320 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 20  his can happen. 
1c330 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c 65   ** (for example
1c340 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  ) when the page 
1c350 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 74  is being moved t
1c360 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  o the freelist. 
1c370 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77 65   But.  ** now we
1c380 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20 6d   are (perhaps) m
1c390 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20 6f  oving the page o
1c3a0 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ff of the freeli
1c3b0 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75 73  st for.  ** reus
1c3c0 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74 6f  e and we need to
1c3d0 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69 6e   know its origin
1c3e0 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74 68  al content so th
1c3f0 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  at content.  ** 
1c400 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
1c410 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1c420 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74 68  urnal.  So do th
1c430 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a 20  e read at this. 
1c440 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20   ** time..  */. 
1c450 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f   rc = pager_get_
1c460 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
1c470 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1c480 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
1c490 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65  /* Mark the page
1c4a0 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20 74   as dirty.  If t
1c4b0 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72 65  he page has alre
1c4c0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1c4d0 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75  .  ** to the jou
1c4e0 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e  rnal then we can
1c4f0 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
1c500 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65 44  ay..  */.  makeD
1c510 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28  irty(pPg);.  if(
1c520 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1c530 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65 6d  && (pageInStatem
1c540 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61 67  ent(pPg) || pPag
1c550 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
1c560 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
1c570 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1c580 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
1c590 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
1c5a0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
1c5b0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
1c5c0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
1c5d0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
1c5e0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1c5f0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
1c600 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
1c610 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
1c620 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
1c630 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
1c640 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
1c650 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
1c660 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
1c670 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
1c680 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
1c690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c6a0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
1c6b0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
1c6c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1c6d0 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20 20  gin(pPg, 0);.   
1c6e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c6f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c720 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1c730 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
1c740 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1c750 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
1c760 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
1c770 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1c780 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
1c790 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1c7a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c7b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c7c0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
1c7d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1c7e0 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
1c7f0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
1c800 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1c810 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
1c820 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
1c830 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
1c840 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
1c850 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
1c860 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
1c870 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
1c880 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
1c890 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
1c8a0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
1c8b0 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
1c8c0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
1c8d0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
1c8e0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1c8f0 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
1c900 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
1c910 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
1c920 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
1c930 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
1c940 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1c950 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1c960 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
1c970 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
1c980 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
1c990 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1c9a0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1c9b0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1c9c0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c9d0 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE3("JOURNAL %d 
1c9e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1c9f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1ca00 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1ca10 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74     assert( pHist
1ca20 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20  ->pOrig==0 );.  
1ca30 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1ca40 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Orig = sqliteMal
1ca50 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
1ca60 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
1ca70 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1ca80 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
1ca90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
1caa0 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
1cab0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1cac0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1cad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cae0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1caf0 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d         u32 cksum
1cb00 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  , saved;.       
1cb10 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 2c     char *pData2,
1cb20 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20   *pEnd;.        
1cb30 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e    /* We should n
1cb40 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74 68  ever write to th
1cb50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1cb60 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20 20  he page that.   
1cb70 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
1cb80 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1cb90 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c  locks.  The foll
1cba0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65 72  owing assert ver
1cbb0 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20 20  ifies.          
1cbc0 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ** that we do no
1cbd0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
1cbe0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1cbf0 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o!=PAGER_MJ_PGNO
1cc00 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
1cc10 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20 43        pData2 = C
1cc20 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70 44  ODEC2(pPager, pD
1cc30 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
1cc40 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b  7);.          ck
1cc50 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75  sum = pager_cksu
1cc60 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70  m(pPager, (u8*)p
1cc70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20  Data2);.        
1cc80 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32 20    pEnd = pData2 
1cc90 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
1cca0 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44  ze;.          pD
1ccb0 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20 20  ata2 -= 4;.     
1ccc0 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
1ccd0 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20 20  32*)pEnd;.      
1cce0 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 45      put32bits(pE
1ccf0 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20 20  nd, cksum);.    
1cd00 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61        szPg = pPa
1cd10 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b  ger->pageSize+8;
1cd20 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33 32  .          put32
1cd30 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1cd40 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1cd50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1cd60 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1cd70 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50 67  fd, pData2, szPg
1cd80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
1cd90 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20 25  RACE(("JOUT %p %
1cda0 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  d %lld %d\n", pP
1cdb0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ager, pPg->pgno,
1cdc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cdd0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1cde0 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 3b 0a  nalOff, szPg));.
1cdf0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f            PAGER_
1ce00 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67  INCR(sqlite3_pag
1ce10 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29  er_writej_count)
1ce20 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1ce30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
1ce40 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
1ce50 20 20 50 41 47 45 52 54 52 41 43 45 35 28 22 4a    PAGERTRACE5("J
1ce60 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1ce70 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61  d needSync=%d ha
1ce80 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1cea0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1ceb0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1cec0 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70 61 67  dSync, pager_pag
1ced0 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20 20 20  ehash(pPg));.   
1cee0 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70 45         *(u32*)pE
1cef0 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20 20  nd = saved;...  
1cf00 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20  /* An error has 
1cf10 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67 20  occured writing 
1cf20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1cf30 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20  ile. The .      
1cf40 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1cf50 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c 65  on will be rolle
1cf60 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c 61  d back by the la
1cf70 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  yer above..     
1cf80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1cf90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cfa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1cfb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cfc0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
1cfd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1cfe0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
1cff0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1d000 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
1d010 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1d020 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
1d030 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1d040 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1d050 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
1d060 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1d070 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
1d080 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1d090 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d0a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1d0b0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1d0c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d0d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1d0e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d0f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d100 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1d110 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
1d120 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1d130 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1d140 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1d150 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
1d160 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1d170 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1d180 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1d190 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1d1a0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1d1b0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
1d1c0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1d1d0 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1d1e0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1d1f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1d200 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1d210 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
1d220 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1d230 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1d240 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1d250 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1d260 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1d270 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1d280 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1d290 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1d2a0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1d2b0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1d2c0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1d2d0 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1d2e0 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1d2f0 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1d300 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1d310 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1d320 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1d330 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1d340 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1d350 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 49 6e  .     && !pageIn
1d360 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1d370 20 20 20 20 20 26 26 20 28 69 6e 74 29 70 50 67       && (int)pPg
1d380 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1d390 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20 29 7b  stmtSize .    ){
1d3a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1d3b0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
1d3c0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
1d3d0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1d3e0 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1d3f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1d400 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d410 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1d420 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1d430 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1d440 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20  pHist->pStmt==0 
1d450 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1d460 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  ->pStmt = sqlite
1d470 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65  MallocRaw( pPage
1d480 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  r->pageSize );. 
1d490 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1d4a0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
1d4b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73       memcpy(pHis
1d4c0 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f  t->pStmt, PGHDR_
1d4d0 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
1d4e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1d4f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d500 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1d510 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
1d520 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
1d530 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1d540 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d550 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
1d560 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
1d570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d580 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 20 3d    char *pData2 =
1d590 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1d5a0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1d5b0 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20 20 20  , 7)-4;.        
1d5c0 70 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32  put32bits(pData2
1d5d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1d5e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d5f0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1d600 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32 2c 20  ->stfd, pData2, 
1d610 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d620 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47  +4);.        PAG
1d630 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a  ERTRACE3("STMT-J
1d640 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
1d650 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
1d660 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1d670 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d690 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1d6a0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1d6b0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1d6c0 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
1d6d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1d6e0 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1d6f0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d700 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
1d710 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1d720 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
1d730 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d740 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
1d750 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
1d760 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61  return..  */.  a
1d770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1d780 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1d790 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ED );.  if( pPag
1d7a0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
1d7b0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
1d7c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
1d7d0 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
1d7e0 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
1d7f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
1d800 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
1d810 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
1d820 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
1d830 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
1d840 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d850 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d860 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1d870 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70 61 67   mark a data-pag
1d880 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e 20 49  e as writable. I
1d890 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67 65 72  t uses .** pager
1d8a0 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70 65 6e  _write() to open
1d8b0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
1d8c0 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1d8d0 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61  ready open).** a
1d8e0 6e 64 20 77 72 69 74 65 20 74 68 65 20 70 61 67  nd write the pag
1d8f0 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68 65 20  e *pData to the 
1d900 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
1d910 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
1d920 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74  tween this funct
1d930 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f 77 72  ion and pager_wr
1d940 69 74 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ite() is that th
1d950 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
1d960 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68 20 74  lso deals with t
1d970 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  he special case 
1d980 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72 65 20  where 2 or more 
1d990 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20  pages.** fit on 
1d9a0 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65  a single disk se
1d9b0 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61  ctor. In this ca
1d9c0 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65  se all co-reside
1d9d0 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74  nt pages.** must
1d9e0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1d9f0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
1da00 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20 72 65  l file before re
1da10 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
1da20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1da30 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
1da40 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
1da50 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48  QLITE_OK;..  PgH
1da60 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67  dr *pPg = pDbPag
1da70 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  e;.  Pager *pPag
1da80 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
1da90 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65 50 65  ;.  Pgno nPagePe
1daa0 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61 67 65  rSector = (pPage
1dab0 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f 70 50  r->sectorSize/pP
1dac0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
1dad0 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26  ..  if( !MEMDB &
1dae0 26 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  & nPagePerSector
1daf0 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  >1 ){.    Pgno n
1db00 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20  PageCount;      
1db10 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d      /* Total num
1db20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1db30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1db40 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20  .    Pgno pg1;  
1db50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db60 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20  * First page of 
1db70 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1db80 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f  s located on. */
1db90 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  .    int nPage; 
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dbb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1dbc0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67  s starting at pg
1dbd0 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  1 to journal */.
1dbe0 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20      int ii;..   
1dbf0 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
1dc00 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
1dc10 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1dc20 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
1dc30 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
1dc40 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
1dc50 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
1dc60 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
1dc70 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
1dc80 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
1dc90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1dca0 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
1dcb0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1dcc0 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
1dcd0 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
1dce0 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
1dcf0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
1dd00 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
1dd10 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
1dd20 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
1dd30 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
1dd40 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
1dd50 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
1dd60 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1dd70 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
1dd80 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
1dd90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
1dda0 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
1ddb0 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
1ddc0 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
1ddd0 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
1dde0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1ddf0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
1de00 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
1de10 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
1de20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
1de30 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
1de40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
1de50 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
1de60 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
1de70 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
1de80 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
1de90 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
1dea0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
1deb0 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
1dec0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
1ded0 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
1dee0 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
1def0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
1df00 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
1df10 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
1df20 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
1df30 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
1df40 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
1df50 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
1df60 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
1df70 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  r->aInJournal ||
1df80 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
1df90 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 67 3e  | .          pg>
1dfa0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1dfb0 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e  ze || !(pPager->
1dfc0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d  aInJournal[pg/8]
1dfd0 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a 20 20  &(1<<(pg&7))).  
1dfe0 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20 20 20      ) {.        
1dff0 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a  if( pg!=PAGER_MJ
1e000 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
1e010 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 64 72  .          PgHdr
1e020 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20   *pPage;.       
1e030 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e040 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
1e050 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
1e060 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e070 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e080 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1e090 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
1e0a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e0b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e0c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1e0d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1e0e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1e0f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1e100 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
1e110 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
1e120 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
1e130 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1e140 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
1e150 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1e160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
1e170 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
1e180 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
1e190 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
1e1a0 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
1e1b0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
1e1c0 67 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20  gerWrite().  In 
1e1d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74  other words, ret
1e1e0 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
1e1f0 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67  s ok.** to chang
1e200 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1e210 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69   the page..*/.#i
1e220 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74  fndef NDEBUG.int
1e230 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1e240 72 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20  riteable(DbPage 
1e250 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
1e260 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65  pPg->dirty;.}.#e
1e270 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
1e280 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
1e290 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74  ./*.** Replace t
1e2a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
1e2b0 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74 68  single page with
1e2c0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1e2d0 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a 2a   in the third.**
1e2e0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
1e2f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 76  t sqlite3PagerOv
1e300 65 72 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  erwrite(Pager *p
1e310 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1e320 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  , void *pData){.
1e330 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1e340 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
1e350 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1e360 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
1e370 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  Pg);.  if( rc==S
1e380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1e3a0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1e3b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e3c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
1e3d0 70 79 28 73 71 6c 69 74 65 33 50 61 67 65 72 47  py(sqlite3PagerG
1e3e0 65 74 44 61 74 61 28 70 50 67 29 2c 20 70 44 61  etData(pPg), pDa
1e3f0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
1e400 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
1e410 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1e420 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  ef(pPg);.  }.  r
1e430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
1e440 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
1e450 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
1e460 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
1e470 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1e480 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
1e490 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
1e4a0 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50  ation on page pP
1e4b0 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  g back to the di
1e4c0 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1e4d0 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1e4e0 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1e4f0 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1e500 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1e510 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1e520 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1e530 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1e540 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1e550 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1e560 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1e570 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1e580 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1e590 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1e5a0 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1e5b0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1e5c0 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1e5d0 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1e5e0 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1e5f0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1e600 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1e610 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1e620 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1e630 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1e640 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1e650 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1e660 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1e670 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1e680 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e690 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1e6a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1e6b0 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1e6c0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1e6d0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1e6e0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1e6f0 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1e700 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1e710 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1e720 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1e730 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1e740 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1e750 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1e760 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1e770 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1e780 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1e790 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1e7a0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1e7b0 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1e7c0 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1e7d0 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1e7e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1e7f0 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1e800 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1e810 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1e820 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1e830 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1e840 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1e850 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1e860 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
1e870 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1e880 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e890 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1e8a0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1e8b0 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
1e8c0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1e8d0 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1e8e0 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
1e8f0 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
1e900 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1e910 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1e920 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1e930 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1e940 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1e950 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
1e960 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  Pg = pDbPage;.  
1e970 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e980 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
1e990 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1e9a0 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79  rn;.  pPg->alway
1e9b0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1e9c0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1e9d0 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1e9e0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73  InUse ){.    ass
1e9f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1ea00 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
1ea10 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1ea20 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74  er->dbSize==(int
1ea30 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50  )pPg->pgno && pP
1ea40 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1ea50 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  <pPager->dbSize 
1ea60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1ea70 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65  his pages is the
1ea80 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68   last page in th
1ea90 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1eaa0 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20  ile has grown.  
1eab0 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68      ** during th
1eac0 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
1ead0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e  ction, then do N
1eae0 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65  OT mark the page
1eaf0 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20   as clean..     
1eb00 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74   ** When the dat
1eb10 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73  abase file grows
1eb20 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73  , we must make s
1eb30 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73  ure that the las
1eb40 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  t page.      ** 
1eb50 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20  gets written at 
1eb60 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68  least once so th
1eb70 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  at the disk file
1eb80 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72   will be the cor
1eb90 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69  rect.      ** si
1eba0 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f  ze. If you do no
1ebb0 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67  t write this pag
1ebc0 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  e and the size o
1ebd0 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  f the file.     
1ebe0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20   ** on the disk 
1ebf0 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f  ends up being to
1ec00 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61  o small, that ca
1ec10 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
1ec20 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  se.      ** corr
1ec30 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68  uption during th
1ec40 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
1ec50 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1ec60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41   }else{.      PA
1ec70 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f  GERTRACE3("DONT_
1ec80 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1ec90 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e   %d\n", pPg->pgn
1eca0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1ecb0 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
1ecc0 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
1ecd0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
1ece0 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d  ->pgno)).      m
1ecf0 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23  akeClean(pPg);.#
1ed00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1ed10 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
1ed20 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
1ed30 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
1ed40 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
1ed50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
1ed60 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1ed70 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1ed80 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
1ed90 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
1eda0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
1edb0 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
1edc0 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
1edd0 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
1ede0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
1edf0 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
1ee00 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
1ee10 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
1ee20 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
1ee30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
1ee40 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20  *.** If we have 
1ee50 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79  not yet actually
1ee60 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
1ee70 74 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28  t of this page (
1ee80 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e  if.** the PgHdr.
1ee90 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73  needRead flag is
1eea0 20 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20   set) then this 
1eeb0 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20  routine acts as 
1eec0 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61  a promise.** tha
1eed0 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20  t we will never 
1eee0 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65  need to read the
1eef0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e   page content in
1ef00 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20   the future..** 
1ef10 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20  so the needRead 
1ef20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61  flag can be clea
1ef30 72 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e  red at this poin
1ef40 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1ef50 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1ef60 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1ef70 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1ef80 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1ef90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1efa0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1efb0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
1efc0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1efd0 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1efe0 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1eff0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1f000 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1f010 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1f020 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1f030 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1f040 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1f050 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1f060 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1f070 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1f080 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1f090 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1f0a0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1f0b0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1f0c0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1f0d0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1f0e0 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52  ;.    pPg->needR
1f0f0 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ead = 0;.    if(
1f100 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1f110 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
1f120 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1f130 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1f140 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1f150 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52 41    }.    PAGERTRA
1f160 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
1f170 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
1f180 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
1f190 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1f1a0 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
1f1b0 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22  GARBAGE %p %d\n"
1f1c0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1f1d0 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28 20  gno)).  }.  if( 
1f1e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1f1f0 65 20 0a 20 20 20 26 26 20 21 70 61 67 65 49 6e  e .   && !pageIn
1f200 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20 0a  Statement(pPg) .
1f210 20 20 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e     && (int)pPg->
1f220 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1f230 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20 20 20  mtSize .  ){.   
1f240 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1f250 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
1f260 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
1f270 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
1f280 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1f290 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
1f2a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1f2b0 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1f2c0 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1f2d0 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  gno&7);.  }.}...
1f2e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1f2f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1f300 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1f310 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1f320 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1f330 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1f340 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1f350 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f360 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1f370 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1f380 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1f390 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1f3a0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1f3b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1f3c0 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
1f3d0 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20  geCountDone ){. 
1f3e0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1f3f0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1f400 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1f410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f420 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 31  gerGet(pPager, 1
1f430 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
1f440 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f450 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1f460 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1f470 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
1f480 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f490 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f4a0 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  n rc;.  .    /* 
1f4b0 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1f4c0 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1f4d0 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65  4. */.    change
1f4e0 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69  _counter = retri
1f4f0 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72  eve32bits(pPgHdr
1f500 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  , 24);.  .    /*
1f510 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
1f520 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
1f530 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
1f540 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
1f550 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74      change_count
1f560 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32 62  er++;.    put32b
1f570 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48 44  its(((char*)PGHD
1f580 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72  R_TO_DATA(pPgHdr
1f590 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  ))+24, change_co
1f5a0 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20 20 20 2f  unter);.  .    /
1f5b0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
1f5c0 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
1f5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1f5e0 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
1f5f0 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
1f600 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b  geCountDone = 1;
1f610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f620 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f630 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1f640 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1f650 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1f660 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1f670 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1f680 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1f690 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1f6a0 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1f6b0 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1f6c0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1f6d0 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1f6e0 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1f6f0 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1f700 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1f710 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1f720 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1f730 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1f740 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1f750 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1f760 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1f770 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1f780 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1f790 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1f7a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f7b0 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1f7c0 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1f7d0 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1f7e0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f7f0 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1f800 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1f810 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1f820 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1f830 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1f840 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1f850 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1f860 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1f870 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1f880 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1f890 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67  to an sqlite3Pag
1f8a0 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1f8b0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
1f8c0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
1f8d0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
1f8e0 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
1f8f0 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
1f900 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
1f910 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
1f920 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
1f930 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
1f940 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1f950 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 50  CommitPhaseOne(P
1f960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
1f970 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1f980 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b  r, Pgno nTrunc){
1f990 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1f9a0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54  TE_OK;..  PAGERT
1f9b0 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
1f9c0 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
1f9d0 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
1f9e0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
1f9f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1fa00 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
1fa10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1fa20 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1fa30 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
1fa40 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1fa50 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
1fa60 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
1fa70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1fa80 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1fa90 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1faa0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1fab0 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
1fac0 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1fad0 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
1fae0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1faf0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1fb00 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1fb10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  ;..    /* If a m
1fb20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1fb30 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
1fb40 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1fb50 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
1fb60 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
1fb70 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
1fb80 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
1fb90 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
1fba0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
1fbb0 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
1fbc0 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
1fbd0 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1fbe0 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
1fbf0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
1fc00 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
1fc10 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
1fc20 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
1fc30 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
1fc40 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
1fc50 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1fc60 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
1fc70 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1fc80 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
1fc90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1fca0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1fcb0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1fcc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fcd0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1fce0 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
1fcf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fd00 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
1fd10 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1fd20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1fd30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1fd40 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1fd50 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1fd60 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1fd70 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
1fd80 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
1fd90 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
1fda0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1fdb0 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1fdc0 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
1fdd0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1fde0 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  i;.        int i
1fdf0 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f  Skip = PAGER_MJ_
1fe00 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20  PGNO(pPager);.  
1fe10 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72        for( i=nTr
1fe20 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72  unc+1; i<=pPager
1fe30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b  ->origDbSize; i+
1fe40 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  + ){.          i
1fe50 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  f( !(pPager->aIn
1fe60 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28  Journal[i/8] & (
1fe70 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69 21  1<<(i&7))) && i!
1fe80 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20  =iSkip ){.      
1fe90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1fea0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
1feb0 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, i, &pPg);.   
1fec0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1fed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fee0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fef0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1ff00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ff10 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
1ff20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1ff30 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1ff40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ff50 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1ff60 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1ff70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1ff80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ff90 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1ffa0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1ffb0 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1ffc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ffd0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1ffe0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1fff0 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
20000 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20020 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
20030 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
20040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
20050 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
20060 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
20070 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20080 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70  3PagerTruncate(p
20090 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
200a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
200b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
200c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
200d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
200e0 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
200f0 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
20100 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
20110 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
20120 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
20130 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
20140 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
20150 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
20160 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20170 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
20180 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65 72  exit;.    pPager
20190 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
201a0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
201b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
201c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
201d0 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
201e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
201f0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
20200 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49   0);.    }.    I
20210 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
20220 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
20230 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
20240 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
20250 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
20260 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
20270 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
20280 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
20290 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
202a0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
202b0 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
202c0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
202d0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
202e0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
202f0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
20300 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
20310 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
20320 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
20330 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
20340 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
20350 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
20360 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
20370 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
20380 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
20390 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a 20  nt, it's.     * 
203a0 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72 6e  better to return
203b0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
203c0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
203d0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
203e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
203f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
20400 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
20410 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
20420 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
20430 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
20440 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
20450 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
20460 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
20470 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
20480 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
20490 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
204a0 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
204b0 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
204c0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
204d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
204e0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
204f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20500 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
20510 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
20520 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
20530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
20540 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
20550 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
20560 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
20570 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
20580 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
20590 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41 43  .  }.  PAGERTRAC
205a0 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  E2("COMMIT %d\n"
205b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
205c0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
205d0 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  ){.    pPg = pag
205e0 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
205f0 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
20600 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29      while( pPg )
20610 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
20620 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
20630 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
20640 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65  ager);.      cle
20650 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
20660 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
20670 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ty = 0;.      pP
20680 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
20690 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
206a0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
206b0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
206c0 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
206d0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
206e0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
206f0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
20700 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
20710 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
20720 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  irty = 0;.#ifnde
20730 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
20740 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
20750 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
20760 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
20770 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
20780 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
20790 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
207a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
207b0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
207c0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
207d0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
207e0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
207f0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
20800 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
20810 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
20820 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
20830 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
20840 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
20850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20860 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
20870 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
20880 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  en || !pPager->d
20890 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61  irtyCache );.  a
208a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
208b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
208c0 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  ED || !pPager->d
208d0 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
208e0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
208f0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
20900 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  );.  return page
20910 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
20920 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  rc);.}../*.** Ro
20930 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
20940 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
20950 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
20960 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
20970 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
20980 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
20990 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
209a0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
209b0 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
209c0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
209d0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
209e0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
209f0 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
20a00 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
20a10 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
20a20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
20a30 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
20a40 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
20a50 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
20a60 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
20a70 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
20a80 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
20a90 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
20aa0 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
20ab0 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
20ac0 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
20ad0 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
20ae0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
20af0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
20b00 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
20b10 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
20b20 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20b30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20b40 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
20b50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20b60 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54  int rc;.  PAGERT
20b70 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
20b80 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
20b90 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
20ba0 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
20bb0 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
20bc0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
20bd0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
20be0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
20bf0 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
20c00 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
20c10 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
20c20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
20c30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
20c40 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
20c50 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
20c60 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
20c70 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
20c80 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
20c90 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
20ca0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
20cb0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
20cc0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
20cd0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
20ce0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
20cf0 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
20d00 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
20d10 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
20d20 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
20d30 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
20d40 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
20d50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
20d60 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f   PAGERTRACE3("RO
20d70 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
20d80 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
20d90 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20da0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
20db0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
20dc0 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
20dd0 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
20de0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
20df0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
20e00 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
20e10 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
20e20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
20e30 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
20e40 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
20e50 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
20e60 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
20e70 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
20e80 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
20e90 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  0;.      if( pPa
20ea0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
20eb0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
20ec0 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70  ->xReiniter(p, p
20ed0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
20ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20ef0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
20f00 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
20f10 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
20f20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
20f30 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
20f40 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65  DbSize;.    page
20f50 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
20f60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
20f70 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20f80 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
20f90 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
20fa0 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
20fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
20fc0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
20fd0 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
20fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20ff0 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
21000 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
21010 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
21020 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21030 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
21040 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
21050 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
21060 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
21070 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21080 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
21090 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
210a0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
210b0 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r, 0);.    }.   
210c0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
210d0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
210e0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
210f0 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
21100 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
21110 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
21120 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
21130 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70   0);.    rc2 = p
21140 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
21150 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
21160 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21170 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
21180 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
21190 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
211a0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
211b0 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  ager, 0);.  }.  
211c0 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  /* pager_reset(p
211d0 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61  Pager); */.  pPa
211e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
211f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
21200 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
21210 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
21220 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
21230 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
21240 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
21250 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
21260 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
21270 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
21280 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
21290 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
212a0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
212b0 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
212c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
212d0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
212e0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
212f0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
21300 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
21310 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
21320 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
21330 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
21340 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
21350 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
21360 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
21370 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
21380 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21390 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
213a0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
213b0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
213c0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
213d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
213e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
213f0 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
21400 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
21410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21420 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
21430 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
21440 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
21450 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
21460 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21470 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
21480 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
21490 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
214a0 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
214b0 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
214c0 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
214d0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
214e0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
214f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
21500 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
21510 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
21520 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
21530 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
21540 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
21550 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62  0;  /* Used to b
21560 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20  e pPager->nOvfl 
21570 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67  */.  a[9] = pPag
21580 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31  er->nRead;.  a[1
21590 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72  0] = pPager->nWr
215a0 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b  ite;.  return a;
215b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
215c0 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d 65   Set the stateme
215d0 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e  nt rollback poin
215e0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
215f0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  utine should be 
21600 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20  called with the 
21610 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
21620 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f  nal already.** o
21630 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74  pen.  A new stat
21640 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73  ement journal is
21650 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63 61   created that ca
21660 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c  n be used to rol
21670 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73  lback.** changes
21680 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   of a single SQL
21690 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20   command within 
216a0 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63  a larger transac
216b0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
216c0 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67  ite3PagerStmtBeg
216d0 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
216e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
216f0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
21700 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
21710 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
21720 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
21730 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
21740 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
21750 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  0 );.  PAGERTRAC
21760 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25  E2("STMT-BEGIN %
21770 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
21780 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45  ager));.  if( ME
21790 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65  MDB ){.    pPage
217a0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31  r->stmtInUse = 1
217b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
217c0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
217d0 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74  >dbSize;.    ret
217e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
217f0 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72   }.  if( !pPager
21800 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
21810 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
21820 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20  tAutoopen = 1;. 
21830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21840 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
21850 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
21860 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67  alOpen );.  pPag
21870 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71  er->aInStmt = sq
21880 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
21890 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
218a0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
218b0 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a  ->aInStmt==0 ){.
218c0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
218d0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
218e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a   SHARED_LOCK); *
218f0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
21900 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23  ITE_NOMEM;.  }.#
21910 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
21920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
21930 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
21940 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d  fd, &pPager->stm
21950 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  tJSize);.  if( r
21960 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
21970 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73  gin_failed;.  as
21980 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
21990 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65  mtJSize == pPage
219a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b  r->journalOff );
219b0 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
219c0 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
219d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
219e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
219f0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
21a00 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
21a10 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
21a20 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
21a30 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
21a40 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
21a50 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
21a60 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
21a70 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
21a80 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  mp(&pPager->stfd
21a90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
21aa0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
21ab0 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
21ac0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
21ad0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
21ae0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
21af0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
21b00 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
21b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
21b20 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
21b30 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
21b40 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
21b50 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
21b60 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
21b70 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
21b80 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21b90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
21ba0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
21bb0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
21bc0 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74  3PagerStmtCommit
21bd0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21be0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
21bf0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
21c00 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
21c10 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41  xt;.    PAGERTRA
21c20 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
21c30 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21c40 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
21c50 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
21c60 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
21c70 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
21c80 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
21c90 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61  e3OsTruncate(pPa
21ca0 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a  ger->stfd, 0); *
21cb0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  /.      sqliteFr
21cc0 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  ee( pPager->aInS
21cd0 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61  tmt );.      pPa
21ce0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
21cf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21d00 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
21d10 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
21d20 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
21d30 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
21d40 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21d50 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21d60 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
21d70 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
21d80 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mt;.        asse
21d90 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d  rt( pHist->inStm
21da0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  t );.        pHi
21db0 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
21dc0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
21dd0 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
21de0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
21df0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
21e00 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
21e10 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
21e20 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
21e30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
21e40 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
21e50 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
21e60 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
21e70 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
21e80 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
21e90 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
21ea0 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
21eb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21ec0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
21ed0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
21ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
21ef0 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  tRollback(Pager 
21f00 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
21f10 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  rc;.  if( pPager
21f20 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
21f30 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
21f40 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
21f50 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
21f60 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
21f70 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
21f80 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
21f90 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
21fa0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
21fb0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
21fc0 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70  Pg; pPg=pHist->p
21fd0 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20  NextStmt){.     
21fe0 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
21ff0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
22000 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
22010 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
22020 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
22030 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
22040 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70  A(pPg), pHist->p
22050 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61  Stmt, pPager->pa
22060 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
22070 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48     sqliteFree(pH
22080 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
22090 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
220a0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
220b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
220c0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
220d0 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
220e0 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ze;.      pager_
220f0 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
22100 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
22110 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
22130 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
22140 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
22150 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22160 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
22170 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
22180 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
22190 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
221a0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
221b0 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
221c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
221d0 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
221e0 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
221f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
22200 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
22210 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
22220 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22230 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22240 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  ->zFilename;.}..
22250 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
22260 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68   directory of th
22270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22280 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
22290 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
222a0 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
222b0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
222c0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b  ger->zDirectory;
222d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
222e0 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
222f0 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
22300 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  l file..*/.const
22310 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
22320 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  gerJournalname(P
22330 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
22340 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22350 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
22360 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
22370 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
22380 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
22390 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
223a0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
223b0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
223c0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
223d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
223e0 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72  agerNosync(Pager
223f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
22400 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  urn pPager->noSy
22410 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  nc;.}..#ifdef SQ
22420 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f  LITE_HAS_CODEC./
22430 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
22440 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
22450 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
22460 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
22470 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
22480 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
22490 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
224a0 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
224b0 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
224c0 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
224d0 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
224e0 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
224f0 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e  pCodecArg;.}.#en
22500 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
22510 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
22520 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
22530 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c  he page pPg to l
22540 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
22550 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  the file. .**.**
22560 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
22570 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
22580 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
22590 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
225a0 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
225b0 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
225c0 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
225d0 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
225e0 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
225f0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
22600 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  us located at pg
22610 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
22620 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
22630 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
22640 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
22650 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
22660 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
22670 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
22680 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
22690 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
226a0 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
226b0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
226c0 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
226d0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
226e0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
226f0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
22700 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
22710 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
22720 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
22730 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
22740 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
22750 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
22760 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
22770 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
22780 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
22790 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
227a0 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
227b0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
227c0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
227d0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
227e0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
227f0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
22800 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
22810 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
22820 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
22830 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
22840 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72  erMovepage(Pager
22850 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67 65   *pPager, DbPage
22860 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
22870 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f  ){.  PgHdr *pPgO
22880 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65  ld;  /* The page
22890 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
228a0 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a  en. */.  int h;.
228b0 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
228c0 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
228d0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
228e0 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45  );..  PAGERTRACE
228f0 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
22900 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
22910 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
22920 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
22930 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
22940 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
22950 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52  c, pgno);.  IOTR
22960 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64  ACE(("MOVE %p %d
22970 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
22980 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29  pPg->pgno, pgno)
22990 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63  )..  pager_get_c
229a0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69  ontent(pPg);.  i
229b0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
229c0 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
229d0 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
229e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
229f0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  g->inJournal );.
22a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
22a10 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73  >dirty );.    as
22a20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
22a30 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
22a40 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66   /* Unlink pPg f
22a50 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68  rom it's hash-ch
22a60 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ain */.  unlinkH
22a70 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
22a80 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20   pPg);..  /* If 
22a90 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69  the cache contai
22aa0 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70  ns a page with p
22ab0 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c  age-number pgno,
22ac0 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20   remove it.  ** 
22ad0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
22ae0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
22af0 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
22b00 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
22b10 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
22b20 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
22b30 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
22b40 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
22b50 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
22b60 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
22b70 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e  e..  */.  pPg->n
22b80 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
22b90 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f  PgOld = pager_lo
22ba0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
22bb0 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64  o);.  if( pPgOld
22bc0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22bd0 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20  pPgOld->nRef==0 
22be0 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73  );.    unlinkHas
22bf0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
22c00 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65  PgOld);.    make
22c10 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20  Clean(pPgOld);. 
22c20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
22c30 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53   = pPgOld->needS
22c40 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ync;.  }else{.  
22c50 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
22c60 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
22c70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
22c80 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
22c90 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
22ca0 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 69  ze ){.    pPg->i
22cb0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50 61  nJournal =  (pPa
22cc0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
22cd0 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70  pgno/8] & (1<<(p
22ce0 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 7d  gno&7)))!=0;.  }
22cf0 65 6c 73 65 20 69 66 28 20 28 69 6e 74 29 70 67  else if( (int)pg
22d00 6e 6f 3e 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no>=pPager->orig
22d10 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 50  DbSize ){.    pP
22d20 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
22d30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22d40 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
22d50 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
22d60 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
22d70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61  );.  }..  /* Cha
22d80 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
22d90 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
22da0 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
22db0 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
22dc0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
22dd0 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67  pgno!=0 );.  pPg
22de0 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
22df0 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
22e00 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
22e10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
22e20 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
22e30 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
22e40 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
22e50 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
22e60 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
22e70 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
22e80 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
22e90 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
22ea0 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
22eb0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
22ec0 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
22ed0 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69  h = 0;..  makeDi
22ee0 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
22ef0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
22f00 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
22f10 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
22f20 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
22f30 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
22f40 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
22f50 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
22f60 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
22f70 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
22f80 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
22f90 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
22fa0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
22fb0 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
22fc0 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
22fd0 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
22fe0 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
22ff0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
23000 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
23010 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
23020 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
23030 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
23040 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
23050 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
23060 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
23070 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
23080 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
23090 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
230a0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63  ite3PagerGet() c
230b0 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68  all may cause th
230c0 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e  e journal to syn
230d0 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  c. So make.    *
230e0 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72  * sure the Pager
230f0 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
23100 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a  s set too..    *
23110 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  /.    int rc;.  
23120 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
23130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23140 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
23150 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23160 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
23170 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20  , needSyncPgno, 
23180 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  &pPgHdr);.    if
23190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
231a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
231b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
231c0 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64  c = 1;.    pPgHd
231d0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
231e0 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a  .    pPgHdr->inJ
231f0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
23200 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72  makeDirty(pPgHdr
23210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
23220 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
23230 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
23240 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
23250 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
23260 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
23270 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
23280 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
23290 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
232a0 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
232b0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
232c0 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  urn PGHDR_TO_DAT
232d0 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  A(pPg);.}../*.**
232e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
232f0 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e  r to the Pager.n
23300 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22  Extra bytes of "
23310 65 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a  extra" space .**
23320 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67   allocated along
23330 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
23340 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
23350 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
23360 65 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a  etExtra(DbPage *
23370 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
23380 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
23390 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ger;.  return (p
233a0 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45  Pager?PGHDR_TO_E
233b0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
233c0 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ):0);.}../*.** G
233d0 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69  et/set the locki
233e0 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  ng-mode for this
233f0 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
23400 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
23410 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f  one.** of PAGER_
23420 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
23430 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  Y, PAGER_LOCKING
23440 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a  MODE_NORMAL or .
23450 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
23460 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20  MODE_EXCLUSIVE. 
23470 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
23480 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
23490 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  then.** the lock
234a0 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  ing-mode is set 
234b0 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
234c0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
234d0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
234e0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
234f0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
23500 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  MAL or.** PAGER_
23510 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23520 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e  USIVE, indicatin
23530 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70  g the current (p
23540 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29  ossibly updated)
23550 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  .** locking-mode
23560 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23570 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
23580 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
23590 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
235a0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
235b0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
235c0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
235d0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
235e0 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52  _LOCKINGMODE_NOR
235f0 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MAL.            
23600 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
23610 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
23620 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
23630 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
23640 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a  MODE_QUERY<0 );.
23650 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
23660 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
23670 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c  AL>=0 && PAGER_L
23680 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
23690 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28  SIVE>=0 );.  if(
236a0 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50   eMode>=0 && !pP
236b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
236c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78  {.    pPager->ex
236d0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d  clusiveMode = eM
236e0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
236f0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65  n (int)pPager->e
23700 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a  xclusiveMode;.}.
23710 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
23720 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
23730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
23740 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T)./*.** Return 
23750 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74  the current stat
23760 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f  e of the file lo
23770 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ck for the given
23780 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72   pager..** The r
23790 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f  eturn value is o
237a0 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53  ne of NO_LOCK, S
237b0 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45  HARED_LOCK, RESE
237c0 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45  RVED_LOCK,.** PE
237d0 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45  NDING_LOCK, or E
237e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a  XCLUSIVE_LOCK..*
237f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
23800 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  erLockstate(Page
23810 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
23820 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f  turn sqlite3OsLo
23830 63 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e  ckState(pPager->
23840 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  fd);.}.#endif..#
23850 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
23860 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
23870 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
23880 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
23890 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
238a0 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
238b0 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d  lite3PagerRefdum
238c0 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  p(Pager *pPager)
238d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
238e0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
238f0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
23900 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
23910 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
23920 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ef<=0 ) continue
23930 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  ;.    sqlite3Deb
23940 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25  ugPrintf("PAGE %
23950 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  3d addr=%p nRef=
23960 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70  %d\n", .       p
23970 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f  Pg->pgno, PGHDR_
23980 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
23990 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a  g->nRef);.  }.}.
239a0 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f  #endif..#endif /
239b0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
239c0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.